dokploy-mcp-server 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/dist/bin.js +2 -2
- package/dist/index.js +54 -29
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# dokploy-mcp-server
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dokploy-mcp-server)
|
|
4
|
+
|
|
3
5
|
A comprehensive [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for [Dokploy](https://dokploy.com/) - the open-source, self-hosted PaaS. Deploy apps, manage containers, databases, domains, and servers through AI assistants like Claude.
|
|
4
6
|
|
|
5
7
|
## Why This Server?
|
|
@@ -12,7 +14,7 @@ The [official Dokploy MCP](https://github.com/Dokploy/mcp) covers only ~5 of 42
|
|
|
12
14
|
| -------------- | ------------------- | ----------------------------- |
|
|
13
15
|
| Projects | 6 tools | 1 tool (6 actions) |
|
|
14
16
|
| Applications | 26 tools | 1 tool (18 actions) |
|
|
15
|
-
| Compose | - | 1 tool (
|
|
17
|
+
| Compose | - | 1 tool (15 actions) |
|
|
16
18
|
| Deployments | - | 1 tool (2 actions) |
|
|
17
19
|
| Docker | - | 1 tool (4 actions) |
|
|
18
20
|
| Domains | 9 tools | 1 tool (8 actions) |
|
|
@@ -99,7 +101,7 @@ Each tool uses an `action` enum to select the operation. Parameters are optional
|
|
|
99
101
|
|
|
100
102
|
Actions: `list | get | create | update | remove | duplicate`
|
|
101
103
|
|
|
102
|
-
Manage projects. `list`
|
|
104
|
+
Manage projects. `list` and `get` return nested environments with their applications, composes, and databases (with names, IDs, and status), so you can discover service IDs without extra calls. `create` requires `name`. `update` requires `projectId` + fields. `remove` requires `projectId`. `duplicate` requires `sourceEnvironmentId` + `name`.
|
|
103
105
|
|
|
104
106
|
### `dokploy_application` (18 actions)
|
|
105
107
|
|
|
@@ -107,11 +109,11 @@ Actions: `create | get | update | move | deploy | start | stop | delete | markRu
|
|
|
107
109
|
|
|
108
110
|
Full application lifecycle. Most actions require `applicationId`. `create` requires `name` + `environmentId`. `deploy` supports `redeploy` flag. `readMonitoring` requires `appName`.
|
|
109
111
|
|
|
110
|
-
### `dokploy_compose` (
|
|
112
|
+
### `dokploy_compose` (15 actions)
|
|
111
113
|
|
|
112
|
-
Actions: `create | get | update | delete | deploy | start | stop | move | loadServices | loadMounts | getDefaultCommand`
|
|
114
|
+
Actions: `create | get | update | delete | deploy | start | stop | move | loadServices | loadMounts | getDefaultCommand | cancelDeployment | cleanQueues | killBuild | refreshToken`
|
|
113
115
|
|
|
114
|
-
Docker Compose management. Most actions require `composeId`. `create` requires `name` + `environmentId`. `loadMounts` requires `serviceName`.
|
|
116
|
+
Docker Compose management. Most actions require `composeId`. `create` requires `name` + `environmentId`. `loadMounts` requires `serviceName`. `cancelDeployment`/`cleanQueues`/`killBuild`/`refreshToken` require `composeId`.
|
|
115
117
|
|
|
116
118
|
### `dokploy_database` (13 actions)
|
|
117
119
|
|
|
@@ -205,3 +207,7 @@ pnpm inspect # Open MCP Inspector
|
|
|
205
207
|
## License
|
|
206
208
|
|
|
207
209
|
MIT
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
**Sponsored by <a href="https://sapientsai.com/"><img src="https://sapientsai.com/images/logo.svg" alt="SapientsAI" width="20" style="vertical-align: middle;"> SapientsAI</a>** — Building agentic AI for businesses
|
package/dist/bin.js
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
if (!process.env.TRANSPORT_TYPE) process.env.TRANSPORT_TYPE = "stdio";
|
|
4
4
|
const args = process.argv.slice(2);
|
|
5
5
|
if (args.includes("--version") || args.includes("-v")) {
|
|
6
|
-
console.log("1.
|
|
6
|
+
console.log("1.3.0");
|
|
7
7
|
process.exit(0);
|
|
8
8
|
}
|
|
9
9
|
if (args.includes("--help") || args.includes("-h")) {
|
|
10
10
|
console.log(`
|
|
11
|
-
Dokploy MCP Server v1.
|
|
11
|
+
Dokploy MCP Server v1.3.0
|
|
12
12
|
|
|
13
13
|
Usage: dokploy-mcp-server [options]
|
|
14
14
|
|
package/dist/index.js
CHANGED
|
@@ -59,6 +59,23 @@ function getDokployClient() {
|
|
|
59
59
|
return client;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/types.ts
|
|
64
|
+
const DB_TYPES = [
|
|
65
|
+
"postgres",
|
|
66
|
+
"mysql",
|
|
67
|
+
"mariadb",
|
|
68
|
+
"mongo",
|
|
69
|
+
"redis"
|
|
70
|
+
];
|
|
71
|
+
const DB_ID_FIELDS = {
|
|
72
|
+
postgres: "postgresId",
|
|
73
|
+
mysql: "mysqlId",
|
|
74
|
+
mariadb: "mariadbId",
|
|
75
|
+
mongo: "mongoId",
|
|
76
|
+
redis: "redisId"
|
|
77
|
+
};
|
|
78
|
+
|
|
62
79
|
//#endregion
|
|
63
80
|
//#region src/utils/formatters.ts
|
|
64
81
|
function formatDate(dateStr) {
|
|
@@ -76,12 +93,27 @@ function statusIcon(status) {
|
|
|
76
93
|
if (s === "stopped") return "[STOPPED]";
|
|
77
94
|
return `[${status.toUpperCase()}]`;
|
|
78
95
|
}
|
|
96
|
+
function formatEnvironmentServices(env) {
|
|
97
|
+
var _env$applications, _env$compose;
|
|
98
|
+
const lines = [];
|
|
99
|
+
if ((_env$applications = env.applications) === null || _env$applications === void 0 ? void 0 : _env$applications.length) for (const app of env.applications) lines.push(` - App: **${app.name}** ${statusIcon(app.applicationStatus)} (ID: ${app.applicationId})`);
|
|
100
|
+
if ((_env$compose = env.compose) === null || _env$compose === void 0 ? void 0 : _env$compose.length) for (const c of env.compose) lines.push(` - Compose: **${c.name}** ${statusIcon(c.composeStatus)} (ID: ${c.composeId})`);
|
|
101
|
+
for (const dbType of DB_TYPES) {
|
|
102
|
+
const dbs = env[dbType];
|
|
103
|
+
if (dbs === null || dbs === void 0 ? void 0 : dbs.length) for (const db of dbs) lines.push(` - ${dbType}: **${db.name}** ${statusIcon(db.applicationStatus)} (ID: ${db.databaseId})`);
|
|
104
|
+
}
|
|
105
|
+
return lines.join("\n");
|
|
106
|
+
}
|
|
79
107
|
function formatProject(project) {
|
|
80
|
-
|
|
81
|
-
const
|
|
108
|
+
const envs = project.environments ?? [];
|
|
109
|
+
const envLines = envs.map((env) => {
|
|
110
|
+
const services = formatEnvironmentServices(env);
|
|
111
|
+
const header = ` - **${env.name}** (ID: ${env.environmentId})`;
|
|
112
|
+
return services ? `${header}\n${services}` : header;
|
|
113
|
+
});
|
|
82
114
|
return `- **${project.name}** (ID: ${project.projectId})
|
|
83
115
|
Description: ${project.description || "None"}
|
|
84
|
-
Environments: ${
|
|
116
|
+
Environments: ${envs.length}${envLines.length ? "\n" + envLines.join("\n") : ""}
|
|
85
117
|
Created: ${formatDate(project.createdAt)}`;
|
|
86
118
|
}
|
|
87
119
|
function formatProjectList(projects) {
|
|
@@ -89,10 +121,11 @@ function formatProjectList(projects) {
|
|
|
89
121
|
return `# Projects (${projects.length})\n\n${projects.map(formatProject).join("\n\n")}`;
|
|
90
122
|
}
|
|
91
123
|
function formatEnvironment(env) {
|
|
124
|
+
const services = formatEnvironmentServices(env);
|
|
92
125
|
return `- **${env.name}** (ID: ${env.environmentId})
|
|
93
126
|
Description: ${env.description || "None"}
|
|
94
127
|
Project: ${env.projectId}
|
|
95
|
-
Created: ${formatDate(env.createdAt)}`;
|
|
128
|
+
Created: ${formatDate(env.createdAt)}${services ? "\n" + services : ""}`;
|
|
96
129
|
}
|
|
97
130
|
function formatEnvironmentList(envs) {
|
|
98
131
|
if (envs.length === 0) return "No environments found.";
|
|
@@ -446,12 +479,16 @@ const ACTIONS$9 = [
|
|
|
446
479
|
"move",
|
|
447
480
|
"loadServices",
|
|
448
481
|
"loadMounts",
|
|
449
|
-
"getDefaultCommand"
|
|
482
|
+
"getDefaultCommand",
|
|
483
|
+
"cancelDeployment",
|
|
484
|
+
"cleanQueues",
|
|
485
|
+
"killBuild",
|
|
486
|
+
"refreshToken"
|
|
450
487
|
];
|
|
451
488
|
function registerComposeTools(server) {
|
|
452
489
|
server.addTool({
|
|
453
490
|
name: "dokploy_compose",
|
|
454
|
-
description: "Manage Docker Compose services. create: name+environmentId. get/delete/start/stop/getDefaultCommand: composeId. update: composeId+fields. deploy: composeId, redeploy?. move: composeId+targetEnvironmentId. loadServices: composeId. loadMounts: composeId+serviceName.",
|
|
491
|
+
description: "Manage Docker Compose services. create: name+environmentId. get/delete/start/stop/getDefaultCommand: composeId. update: composeId+fields. deploy: composeId, redeploy?. move: composeId+targetEnvironmentId. loadServices: composeId. loadMounts: composeId+serviceName. cancelDeployment/cleanQueues/killBuild/refreshToken: composeId.",
|
|
455
492
|
parameters: z.object({
|
|
456
493
|
action: z.enum(ACTIONS$9),
|
|
457
494
|
composeId: z.string().optional(),
|
|
@@ -535,28 +572,17 @@ function registerComposeTools(server) {
|
|
|
535
572
|
return `# Mounts: ${args.serviceName}\n\n\`\`\`json\n${JSON.stringify(mounts, null, 2)}\n\`\`\``;
|
|
536
573
|
}
|
|
537
574
|
case "getDefaultCommand": return `Default command: ${await client.get("compose.getDefaultCommand", { composeId: args.composeId })}`;
|
|
575
|
+
case "cancelDeployment":
|
|
576
|
+
case "cleanQueues":
|
|
577
|
+
case "killBuild":
|
|
578
|
+
case "refreshToken":
|
|
579
|
+
await client.post(`compose.${args.action}`, { composeId: args.composeId });
|
|
580
|
+
return `Compose ${args.composeId}: ${args.action} completed.`;
|
|
538
581
|
}
|
|
539
582
|
}
|
|
540
583
|
});
|
|
541
584
|
}
|
|
542
585
|
|
|
543
|
-
//#endregion
|
|
544
|
-
//#region src/types.ts
|
|
545
|
-
const DB_TYPES = [
|
|
546
|
-
"postgres",
|
|
547
|
-
"mysql",
|
|
548
|
-
"mariadb",
|
|
549
|
-
"mongo",
|
|
550
|
-
"redis"
|
|
551
|
-
];
|
|
552
|
-
const DB_ID_FIELDS = {
|
|
553
|
-
postgres: "postgresId",
|
|
554
|
-
mysql: "mysqlId",
|
|
555
|
-
mariadb: "mariadbId",
|
|
556
|
-
mongo: "mongoId",
|
|
557
|
-
redis: "redisId"
|
|
558
|
-
};
|
|
559
|
-
|
|
560
586
|
//#endregion
|
|
561
587
|
//#region src/tools/database-tools.ts
|
|
562
588
|
const dbTypeSchema = z.enum(DB_TYPES).describe("postgres, mysql, mariadb, mongo, or redis");
|
|
@@ -688,7 +714,7 @@ const ACTIONS$7 = ["list", "killProcess"];
|
|
|
688
714
|
function registerDeploymentTools(server) {
|
|
689
715
|
server.addTool({
|
|
690
716
|
name: "dokploy_deployment",
|
|
691
|
-
description: "Manage deployments. list: applicationId|composeId|serverId|type+id. killProcess: deploymentId.",
|
|
717
|
+
description: "Manage deployments. list: applicationId|composeId|serverId|type+id. killProcess: deploymentId. Note: no log retrieval API exists; deployment data includes logPath for reference only.",
|
|
692
718
|
parameters: z.object({
|
|
693
719
|
action: z.enum(ACTIONS$7),
|
|
694
720
|
deploymentId: z.string().optional(),
|
|
@@ -732,7 +758,7 @@ const ACTIONS$6 = [
|
|
|
732
758
|
function registerDockerTools(server) {
|
|
733
759
|
server.addTool({
|
|
734
760
|
name: "dokploy_docker",
|
|
735
|
-
description: "Docker management. getContainers: serverId?. restartContainer: containerId. getConfig: containerId, serverId?. findContainers: appName+method(match|label|stack|service), serverId?.",
|
|
761
|
+
description: "Docker container management. getContainers: list all containers, serverId?. restartContainer: containerId. getConfig: containerId (required, not appName), serverId?. findContainers: appName+method(match|label|stack|service), serverId?.",
|
|
736
762
|
parameters: z.object({
|
|
737
763
|
action: z.enum(ACTIONS$6),
|
|
738
764
|
containerId: z.string().optional(),
|
|
@@ -762,6 +788,7 @@ function registerDockerTools(server) {
|
|
|
762
788
|
return `# Container Config\n\n\`\`\`json\n${JSON.stringify(config, null, 2)}\n\`\`\``;
|
|
763
789
|
}
|
|
764
790
|
case "findContainers": {
|
|
791
|
+
if (!args.method) throw new Error("findContainers requires method (match|label|stack|service)");
|
|
765
792
|
const endpointMap = {
|
|
766
793
|
match: "docker.getContainersByAppNameMatch",
|
|
767
794
|
label: "docker.getContainersByAppLabel",
|
|
@@ -1033,14 +1060,13 @@ const ACTIONS$2 = [
|
|
|
1033
1060
|
function registerProjectTools(server) {
|
|
1034
1061
|
server.addTool({
|
|
1035
1062
|
name: "dokploy_project",
|
|
1036
|
-
description: "Manage projects. list: all. get: projectId. create: name. update: projectId+fields. remove: projectId. duplicate: sourceEnvironmentId+name.",
|
|
1063
|
+
description: "Manage projects. list: all (includes nested environments with applications, composes, databases). get: projectId (same nested detail). create: name. update: projectId+fields. remove: projectId. duplicate: sourceEnvironmentId+name.",
|
|
1037
1064
|
parameters: z.object({
|
|
1038
1065
|
action: z.enum(ACTIONS$2),
|
|
1039
1066
|
projectId: z.string().optional(),
|
|
1040
1067
|
name: z.string().optional(),
|
|
1041
1068
|
description: z.string().optional(),
|
|
1042
1069
|
sourceEnvironmentId: z.string().optional(),
|
|
1043
|
-
includeServices: z.boolean().optional(),
|
|
1044
1070
|
duplicateInSameProject: z.boolean().optional()
|
|
1045
1071
|
}),
|
|
1046
1072
|
execute: async (args) => {
|
|
@@ -1067,7 +1093,6 @@ function registerProjectTools(server) {
|
|
|
1067
1093
|
sourceEnvironmentId: args.sourceEnvironmentId,
|
|
1068
1094
|
name: args.name,
|
|
1069
1095
|
...args.description && { description: args.description },
|
|
1070
|
-
...args.includeServices !== void 0 && { includeServices: args.includeServices },
|
|
1071
1096
|
...args.duplicateInSameProject !== void 0 && { duplicateInSameProject: args.duplicateInSameProject }
|
|
1072
1097
|
});
|
|
1073
1098
|
return `Environment duplicated as "${args.name}".`;
|
|
@@ -1198,7 +1223,7 @@ function registerSettingsTools(server) {
|
|
|
1198
1223
|
//#endregion
|
|
1199
1224
|
//#region src/index.ts
|
|
1200
1225
|
dotenv.config();
|
|
1201
|
-
const VERSION = "1.
|
|
1226
|
+
const VERSION = "1.3.0";
|
|
1202
1227
|
function setupDokployClient() {
|
|
1203
1228
|
const baseUrl = process.env.DOKPLOY_URL;
|
|
1204
1229
|
const apiKey = process.env.DOKPLOY_API_KEY;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS"],"sources":["../src/client/dokploy-client.ts","../src/utils/formatters.ts","../src/tools/application-tools.ts","../src/tools/backup-tools.ts","../src/tools/compose-tools.ts","../src/types.ts","../src/tools/database-tools.ts","../src/tools/deployment-tools.ts","../src/tools/docker-tools.ts","../src/tools/domain-tools.ts","../src/tools/environment-tools.ts","../src/tools/infrastructure-tools.ts","../src/tools/project-tools.ts","../src/tools/server-tools.ts","../src/tools/settings-tools.ts","../src/index.ts"],"sourcesContent":["type RequestOptions = {\n method: \"GET\" | \"POST\"\n params?: Record<string, string | number | boolean | undefined>\n body?: Record<string, unknown>\n}\n\nexport class DokployClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\")\n this.apiKey = apiKey\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n return this.request<T>(path, { method: \"GET\", params })\n }\n\n async post<T>(path: string, body?: Record<string, unknown>): Promise<T> {\n return this.request<T>(path, { method: \"POST\", body })\n }\n\n private async request<T>(path: string, options: RequestOptions): Promise<T> {\n const url = new URL(`/api/${path}`, this.baseUrl)\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"x-api-key\": this.apiKey,\n Accept: \"application/json\",\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n }\n\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\"\n init.body = JSON.stringify(options.body)\n }\n\n const response = await fetch(url.toString(), init)\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\")\n throw new Error(\n `Dokploy API error (${response.status} ${response.statusText}) on ${options.method} /${path}: ${errorText}`,\n )\n }\n\n const text = await response.text()\n if (!text) {\n return undefined as T\n }\n\n return JSON.parse(text) as T\n }\n}\n\nlet client: DokployClient | undefined\n\nexport function initializeDokployClient(baseUrl: string, apiKey: string): DokployClient {\n client = new DokployClient(baseUrl, apiKey)\n return client\n}\n\nexport function getDokployClient(): DokployClient {\n if (!client) {\n throw new Error(\n \"Dokploy client not initialized. Ensure DOKPLOY_URL and DOKPLOY_API_KEY environment variables are set.\",\n )\n }\n return client\n}\n","import type {\n DokployApplication,\n DokployBackup,\n DokployCompose,\n DokployContainer,\n DokployDatabase,\n DokployDeployment,\n DokployDomain,\n DokployEnvironment,\n DokployProject,\n DokployServer,\n} from \"../types\"\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return \"N/A\"\n try {\n return new Date(dateStr)\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d+Z$/, \" UTC\")\n } catch {\n return dateStr\n }\n}\n\nfunction statusIcon(status: string): string {\n const s = status.toLowerCase()\n if (s === \"running\" || s === \"done\" || s === \"idle\") return \"[RUNNING]\"\n if (s === \"error\" || s === \"failed\") return \"[ERROR]\"\n if (s === \"stopped\") return \"[STOPPED]\"\n return `[${status.toUpperCase()}]`\n}\n\nexport function formatProject(project: DokployProject): string {\n const envCount = project.environments?.length ?? 0\n return `- **${project.name}** (ID: ${project.projectId})\n Description: ${project.description || \"None\"}\n Environments: ${envCount}\n Created: ${formatDate(project.createdAt)}`\n}\n\nexport function formatProjectList(projects: DokployProject[]): string {\n if (projects.length === 0) return \"No projects found.\"\n return `# Projects (${projects.length})\\n\\n${projects.map(formatProject).join(\"\\n\\n\")}`\n}\n\nexport function formatEnvironment(env: DokployEnvironment): string {\n return `- **${env.name}** (ID: ${env.environmentId})\n Description: ${env.description || \"None\"}\n Project: ${env.projectId}\n Created: ${formatDate(env.createdAt)}`\n}\n\nexport function formatEnvironmentList(envs: DokployEnvironment[]): string {\n if (envs.length === 0) return \"No environments found.\"\n return `# Environments (${envs.length})\\n\\n${envs.map(formatEnvironment).join(\"\\n\\n\")}`\n}\n\nexport function formatApplication(app: DokployApplication): string {\n return `- **${app.name}** ${statusIcon(app.applicationStatus)} (ID: ${app.applicationId})\n App Name: ${app.appName}\n Description: ${app.description || \"None\"}\n Build Type: ${app.buildType || \"N/A\"}\n Source: ${app.sourceType || \"N/A\"}\n Auto Deploy: ${app.autoDeploy ?? \"N/A\"}\n Created: ${formatDate(app.createdAt)}`\n}\n\nexport function formatDeployment(dep: DokployDeployment): string {\n return `- ${statusIcon(dep.status)} **${dep.title || \"Deployment\"}** (ID: ${dep.deploymentId})\n Status: ${dep.status}\n Description: ${dep.description || \"None\"}\n Created: ${formatDate(dep.createdAt)}`\n}\n\nexport function formatDeploymentList(deployments: DokployDeployment[]): string {\n if (deployments.length === 0) return \"No deployments found.\"\n return `# Deployments (${deployments.length})\\n\\n${deployments.map(formatDeployment).join(\"\\n\\n\")}`\n}\n\nexport function formatCompose(compose: DokployCompose): string {\n return `- **${compose.name}** ${statusIcon(compose.composeStatus)} (ID: ${compose.composeId})\n App Name: ${compose.appName}\n Description: ${compose.description || \"None\"}\n Type: ${compose.composeType || \"N/A\"}\n Source: ${compose.sourceType || \"N/A\"}\n Created: ${formatDate(compose.createdAt)}`\n}\n\nexport function formatDomain(domain: DokployDomain): string {\n const protocol = domain.https ? \"https\" : \"http\"\n return `- **${protocol}://${domain.host}${domain.path || \"\"}** (ID: ${domain.domainId})\n Port: ${domain.port ?? \"default\"}\n HTTPS: ${domain.https}\n Certificate: ${domain.certificateType || \"None\"}\n Type: ${domain.domainType || \"N/A\"}\n Service: ${domain.serviceName || \"N/A\"}`\n}\n\nexport function formatDomainList(domains: DokployDomain[]): string {\n if (domains.length === 0) return \"No domains found.\"\n return `# Domains (${domains.length})\\n\\n${domains.map(formatDomain).join(\"\\n\\n\")}`\n}\n\nexport function formatServer(server: DokployServer): string {\n return `- **${server.name}** (ID: ${server.serverId})\n Description: ${server.description || \"None\"}\n IP: ${server.ipAddress}:${server.port}\n User: ${server.username}\n Type: ${server.serverType}\n Created: ${formatDate(server.createdAt)}`\n}\n\nexport function formatServerList(servers: DokployServer[]): string {\n if (servers.length === 0) return \"No servers found.\"\n return `# Servers (${servers.length})\\n\\n${servers.map(formatServer).join(\"\\n\\n\")}`\n}\n\nexport function formatDatabase(db: DokployDatabase, dbType: string): string {\n return `- **${db.name}** ${statusIcon(db.applicationStatus)} (ID: ${db.databaseId})\n Type: ${dbType}\n App Name: ${db.appName}\n Description: ${db.description || \"None\"}\n Database Name: ${db.databaseName || \"N/A\"}\n Image: ${db.dockerImage || \"default\"}\n External Port: ${db.externalPort ?? \"None\"}\n Created: ${formatDate(db.createdAt)}`\n}\n\nexport function formatContainer(container: DokployContainer): string {\n return `- **${container.name}** [${container.state?.toUpperCase() || \"UNKNOWN\"}]\n ID: ${container.containerId}\n Image: ${container.image}\n Status: ${container.status}\n Ports: ${container.ports || \"None\"}`\n}\n\nexport function formatContainerList(containers: DokployContainer[]): string {\n if (containers.length === 0) return \"No containers found.\"\n return `# Containers (${containers.length})\\n\\n${containers.map(formatContainer).join(\"\\n\\n\")}`\n}\n\nexport function formatBackup(backup: DokployBackup): string {\n return `- **${backup.prefix}** (ID: ${backup.backupId})\n Schedule: ${backup.schedule}\n Enabled: ${backup.enabled ?? true}\n Database: ${backup.database}\n Type: ${backup.databaseType}\n Destination: ${backup.destinationId}\n Keep Latest: ${backup.keepLatestCount ?? \"unlimited\"}`\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployApplication } from \"../types\"\nimport { formatApplication } from \"../utils/formatters\"\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"move\",\n \"deploy\",\n \"start\",\n \"stop\",\n \"delete\",\n \"markRunning\",\n \"refreshToken\",\n \"cleanQueues\",\n \"killBuild\",\n \"cancelDeployment\",\n \"reload\",\n \"saveEnvironment\",\n \"saveBuildType\",\n \"traefikConfig\",\n \"readMonitoring\",\n] as const\n\nconst SIMPLE_ACTIONS = [\n \"start\",\n \"stop\",\n \"delete\",\n \"markRunning\",\n \"refreshToken\",\n \"cleanQueues\",\n \"killBuild\",\n \"cancelDeployment\",\n] as const\ntype SimpleAction = (typeof SIMPLE_ACTIONS)[number]\n\nexport function registerApplicationTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_application\",\n description:\n \"Manage applications. create: name+environmentId. get: applicationId. update: applicationId+fields. move: applicationId+targetEnvironmentId. deploy: applicationId, redeploy?. start/stop/delete/markRunning/refreshToken/cleanQueues/killBuild/cancelDeployment: applicationId. reload: applicationId+appName. saveEnvironment: applicationId+env. saveBuildType: applicationId+buildType. traefikConfig: applicationId, traefikConfig? (omit to read). readMonitoring: appName.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n applicationId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n description: z.string().optional(),\n serverId: z.string().optional(),\n targetEnvironmentId: z.string().optional(),\n redeploy: z.boolean().optional(),\n title: z.string().optional(),\n deployDescription: z.string().optional().describe(\"Deploy description (maps to API description field)\"),\n dockerImage: z.string().optional(),\n command: z.string().optional(),\n memoryLimit: z.number().optional(),\n cpuLimit: z.number().optional(),\n replicas: z.number().optional(),\n autoDeploy: z.boolean().optional(),\n appName: z.string().optional(),\n env: z.string().optional().describe(\"KEY=VALUE pairs, newline separated\"),\n buildArgs: z.string().optional(),\n createEnvFile: z.boolean().optional(),\n buildType: z.string().optional(),\n dockerfile: z.string().optional(),\n dockerContextPath: z.string().optional(),\n dockerBuildStage: z.string().optional(),\n publishDirectory: z.string().optional(),\n traefikConfig: z.string().optional().describe(\"New config content (omit to read current)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const app = await client.post<DokployApplication>(\"application.create\", {\n name: args.name!,\n environmentId: args.environmentId!,\n ...(args.description && { description: args.description }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Application Created\\n\\n${formatApplication(app)}`\n }\n case \"get\": {\n const app = await client.get<DokployApplication>(\"application.one\", {\n applicationId: args.applicationId!,\n })\n return `# Application Details\\n\\n${formatApplication(app)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { applicationId: args.applicationId! }\n const updateFields = [\n \"name\",\n \"description\",\n \"dockerImage\",\n \"command\",\n \"memoryLimit\",\n \"cpuLimit\",\n \"replicas\",\n \"autoDeploy\",\n ] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"application.update\", body)\n return `Application ${args.applicationId} updated.`\n }\n case \"move\": {\n await client.post(\"application.move\", {\n applicationId: args.applicationId!,\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Application ${args.applicationId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"deploy\": {\n const endpoint = args.redeploy ? \"application.redeploy\" : \"application.deploy\"\n await client.post(endpoint, {\n applicationId: args.applicationId!,\n ...(args.title && { title: args.title }),\n ...(args.deployDescription && { description: args.deployDescription }),\n })\n return `${args.redeploy ? \"Redeployment\" : \"Deployment\"} triggered for application ${args.applicationId}.`\n }\n case \"start\":\n case \"stop\":\n case \"delete\":\n case \"markRunning\":\n case \"refreshToken\":\n case \"cleanQueues\":\n case \"killBuild\":\n case \"cancelDeployment\": {\n await client.post(`application.${args.action satisfies SimpleAction}`, {\n applicationId: args.applicationId!,\n })\n return `Application ${args.applicationId}: ${args.action} completed.`\n }\n case \"reload\": {\n await client.post(\"application.reload\", {\n applicationId: args.applicationId!,\n appName: args.appName!,\n })\n return `Application ${args.applicationId} reloaded.`\n }\n case \"saveEnvironment\": {\n await client.post(\"application.saveEnvironment\", {\n applicationId: args.applicationId!,\n createEnvFile: args.createEnvFile ?? false,\n ...(args.env !== undefined && { env: args.env }),\n ...(args.buildArgs !== undefined && { buildArgs: args.buildArgs }),\n })\n return `Environment saved for application ${args.applicationId}.`\n }\n case \"saveBuildType\": {\n await client.post(\"application.saveBuildType\", {\n applicationId: args.applicationId!,\n buildType: args.buildType!,\n dockerContextPath: args.dockerContextPath || \".\",\n dockerBuildStage: args.dockerBuildStage || \"\",\n ...(args.dockerfile && { dockerfile: args.dockerfile }),\n ...(args.publishDirectory && { publishDirectory: args.publishDirectory }),\n })\n return `Build type set to \"${args.buildType}\" for application ${args.applicationId}.`\n }\n case \"traefikConfig\": {\n if (args.traefikConfig) {\n await client.post(\"application.updateTraefikConfig\", {\n applicationId: args.applicationId!,\n traefikConfig: args.traefikConfig,\n })\n return `Traefik config updated for application ${args.applicationId}.`\n }\n const config = await client.get<string>(\"application.readTraefikConfig\", {\n applicationId: args.applicationId!,\n })\n return `# Traefik Config\\n\\n\\`\\`\\`yaml\\n${config}\\n\\`\\`\\``\n }\n case \"readMonitoring\": {\n const data = await client.get<unknown>(\"application.readAppMonitoring\", { appName: args.appName! })\n return `# Monitoring: ${args.appName}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployBackup } from \"../types\"\nimport { formatBackup } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"get\", \"update\", \"remove\", \"listFiles\", \"manualBackup\"] as const\n\nexport function registerBackupTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_backup\",\n description:\n \"Manage backups. create: schedule+prefix+destinationId+database+databaseType. get: backupId. update: backupId+fields. remove: backupId. listFiles: destinationId. manualBackup: backupId+backupType.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n backupId: z.string().optional(),\n schedule: z.string().optional().describe(\"Cron expression\"),\n prefix: z.string().optional(),\n destinationId: z.string().optional(),\n database: z.string().optional(),\n databaseType: z.string().optional().describe(\"postgres, mysql, mariadb, or mongo\"),\n serviceName: z.string().optional(),\n enabled: z.boolean().optional(),\n keepLatestCount: z.number().optional(),\n postgresId: z.string().optional(),\n mysqlId: z.string().optional(),\n mariadbId: z.string().optional(),\n mongoId: z.string().optional(),\n composeId: z.string().optional(),\n backupType: z.enum([\"postgres\", \"mysql\", \"mariadb\", \"mongo\", \"compose\"]).optional(),\n search: z.string().optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = {}\n const fields = [\n \"schedule\",\n \"prefix\",\n \"destinationId\",\n \"database\",\n \"databaseType\",\n \"enabled\",\n \"keepLatestCount\",\n \"postgresId\",\n \"mysqlId\",\n \"mariadbId\",\n \"mongoId\",\n \"composeId\",\n \"serviceName\",\n ] as const\n for (const key of fields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const backup = await client.post<DokployBackup>(\"backup.create\", body)\n return `# Backup Created\\n\\n${formatBackup(backup)}`\n }\n case \"get\": {\n const backup = await client.get<DokployBackup>(\"backup.one\", { backupId: args.backupId! })\n return `# Backup Details\\n\\n${formatBackup(backup)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = {}\n const fields = [\n \"backupId\",\n \"schedule\",\n \"prefix\",\n \"destinationId\",\n \"database\",\n \"serviceName\",\n \"databaseType\",\n \"enabled\",\n \"keepLatestCount\",\n ] as const\n for (const key of fields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"backup.update\", body)\n return `Backup ${args.backupId} updated.`\n }\n case \"remove\": {\n await client.post(\"backup.remove\", { backupId: args.backupId! })\n return `Backup ${args.backupId} removed.`\n }\n case \"listFiles\": {\n const files = await client.get<unknown>(\"backup.listBackupFiles\", {\n destinationId: args.destinationId!,\n ...(args.search && { search: args.search }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Backup Files\\n\\n\\`\\`\\`json\\n${JSON.stringify(files, null, 2)}\\n\\`\\`\\``\n }\n case \"manualBackup\": {\n const endpointMap: Record<string, string> = {\n postgres: \"backup.manualBackupPostgres\",\n mysql: \"backup.manualBackupMySql\",\n mariadb: \"backup.manualBackupMariadb\",\n mongo: \"backup.manualBackupMongo\",\n compose: \"backup.manualBackupCompose\",\n }\n const endpoint = endpointMap[args.backupType!]\n await client.post(endpoint, { backupId: args.backupId! })\n return `Manual ${args.backupType} backup triggered for backup config ${args.backupId}.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployCompose } from \"../types\"\nimport { formatCompose } from \"../utils/formatters\"\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"delete\",\n \"deploy\",\n \"start\",\n \"stop\",\n \"move\",\n \"loadServices\",\n \"loadMounts\",\n \"getDefaultCommand\",\n] as const\n\nexport function registerComposeTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_compose\",\n description:\n \"Manage Docker Compose services. create: name+environmentId. get/delete/start/stop/getDefaultCommand: composeId. update: composeId+fields. deploy: composeId, redeploy?. move: composeId+targetEnvironmentId. loadServices: composeId. loadMounts: composeId+serviceName.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n composeId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n description: z.string().optional(),\n composeType: z.string().optional().describe(\"docker-compose or stack\"),\n composeFile: z.string().optional(),\n serverId: z.string().optional(),\n env: z.string().optional(),\n command: z.string().optional(),\n deleteVolumes: z.boolean().optional(),\n redeploy: z.boolean().optional(),\n title: z.string().optional(),\n deployDescription: z.string().optional(),\n targetEnvironmentId: z.string().optional(),\n type: z.string().optional(),\n serviceName: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const compose = await client.post<DokployCompose>(\"compose.create\", {\n name: args.name!,\n environmentId: args.environmentId!,\n ...(args.description && { description: args.description }),\n ...(args.composeType && { composeType: args.composeType }),\n ...(args.composeFile && { composeFile: args.composeFile }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Compose Created\\n\\n${formatCompose(compose)}`\n }\n case \"get\": {\n const compose = await client.get<DokployCompose>(\"compose.one\", { composeId: args.composeId! })\n return `# Compose Details\\n\\n${formatCompose(compose)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { composeId: args.composeId! }\n const updateFields = [\"name\", \"description\", \"composeFile\", \"env\", \"command\"] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"compose.update\", body)\n return `Compose ${args.composeId} updated.`\n }\n case \"delete\": {\n await client.post(\"compose.delete\", {\n composeId: args.composeId!,\n deleteVolumes: args.deleteVolumes ?? false,\n })\n return `Compose ${args.composeId} deleted.`\n }\n case \"deploy\": {\n const endpoint = args.redeploy ? \"compose.redeploy\" : \"compose.deploy\"\n await client.post(endpoint, {\n composeId: args.composeId!,\n ...(args.title && { title: args.title }),\n ...(args.deployDescription && { description: args.deployDescription }),\n })\n return `${args.redeploy ? \"Redeployment\" : \"Deployment\"} triggered for compose ${args.composeId}.`\n }\n case \"start\":\n case \"stop\": {\n await client.post(`compose.${args.action}`, { composeId: args.composeId! })\n return `Compose ${args.composeId}: ${args.action} completed.`\n }\n case \"move\": {\n await client.post(\"compose.move\", {\n composeId: args.composeId!,\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Compose ${args.composeId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"loadServices\": {\n const services = await client.get<unknown>(\"compose.loadServices\", {\n composeId: args.composeId!,\n ...(args.type && { type: args.type }),\n })\n return `# Compose Services\\n\\n\\`\\`\\`json\\n${JSON.stringify(services, null, 2)}\\n\\`\\`\\``\n }\n case \"loadMounts\": {\n const mounts = await client.get<unknown>(\"compose.loadMountsByService\", {\n composeId: args.composeId!,\n serviceName: args.serviceName!,\n })\n return `# Mounts: ${args.serviceName}\\n\\n\\`\\`\\`json\\n${JSON.stringify(mounts, null, 2)}\\n\\`\\`\\``\n }\n case \"getDefaultCommand\": {\n const command = await client.get<string>(\"compose.getDefaultCommand\", { composeId: args.composeId! })\n return `Default command: ${command}`\n }\n }\n },\n })\n}\n","export const DB_TYPES = [\"postgres\", \"mysql\", \"mariadb\", \"mongo\", \"redis\"] as const\nexport type DatabaseType = (typeof DB_TYPES)[number]\n\nexport const DB_ID_FIELDS: Record<DatabaseType, string> = {\n postgres: \"postgresId\",\n mysql: \"mysqlId\",\n mariadb: \"mariadbId\",\n mongo: \"mongoId\",\n redis: \"redisId\",\n}\n\nexport type DokployProject = {\n projectId: string\n name: string\n description?: string\n createdAt?: string\n organizationId?: string\n environments?: DokployEnvironment[]\n}\n\nexport type DokployEnvironment = {\n environmentId: string\n name: string\n description?: string\n projectId: string\n createdAt?: string\n}\n\nexport type DokployApplication = {\n applicationId: string\n name: string\n appName: string\n description?: string\n applicationStatus: string\n buildType?: string\n sourceType?: string\n dockerImage?: string\n repository?: string\n branch?: string\n environmentId: string\n createdAt?: string\n autoDeploy?: boolean\n env?: string\n domains?: DokployDomain[]\n}\n\nexport type DokployCompose = {\n composeId: string\n name: string\n appName: string\n description?: string\n composeFile?: string\n composeType?: string\n composeStatus: string\n sourceType?: string\n environmentId: string\n createdAt?: string\n}\n\nexport type DokployDeployment = {\n deploymentId: string\n title?: string\n description?: string\n status: string\n logPath?: string\n applicationId?: string\n composeId?: string\n serverId?: string\n createdAt?: string\n}\n\nexport type DokployDomain = {\n domainId: string\n host: string\n path?: string\n port?: number\n https: boolean\n certificateType?: string\n applicationId?: string\n composeId?: string\n serviceName?: string\n domainType?: string\n createdAt?: string\n}\n\nexport type DokployServer = {\n serverId: string\n name: string\n description?: string\n ipAddress: string\n port: number\n username: string\n sshKeyId: string\n serverType: string\n createdAt?: string\n}\n\nexport type DokployDatabase = {\n databaseId: string\n name: string\n appName: string\n description?: string\n databaseName?: string\n databaseUser?: string\n dockerImage?: string\n applicationStatus: string\n environmentId: string\n externalPort?: number\n createdAt?: string\n}\n\nexport type DokployBackup = {\n backupId: string\n schedule: string\n enabled?: boolean\n prefix: string\n destinationId: string\n database: string\n databaseType: string\n keepLatestCount?: number\n postgresId?: string\n mysqlId?: string\n mariadbId?: string\n mongoId?: string\n}\n\nexport type DokployContainer = {\n containerId: string\n name: string\n image: string\n state: string\n status: string\n ports?: string\n}\n\nexport type DokployMount = {\n mountId: string\n type: string\n hostPath?: string\n volumeName?: string\n mountPath: string\n applicationId?: string\n}\n\nexport type DokployPort = {\n portId: string\n publishedPort: number\n targetPort: number\n protocol?: string\n publishMode?: string\n applicationId?: string\n}\n\nexport type DokployCertificate = {\n certificateId: string\n name: string\n certificateData?: string\n privateKey?: string\n autoRenew?: boolean\n}\n\nexport type DokploySecurity = {\n securityId: string\n username: string\n password: string\n applicationId?: string\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DatabaseType, DokployDatabase } from \"../types\"\nimport { DB_ID_FIELDS, DB_TYPES } from \"../types\"\nimport { formatDatabase } from \"../utils/formatters\"\n\nconst dbTypeSchema = z.enum(DB_TYPES).describe(\"postgres, mysql, mariadb, mongo, or redis\")\n\nfunction dbIdField(dbType: DatabaseType): string {\n return DB_ID_FIELDS[dbType]\n}\n\nfunction dbBody(dbType: DatabaseType, databaseId: string): Record<string, unknown> {\n return { [dbIdField(dbType)]: databaseId }\n}\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"move\",\n \"start\",\n \"stop\",\n \"deploy\",\n \"rebuild\",\n \"remove\",\n \"reload\",\n \"changeStatus\",\n \"saveEnvironment\",\n \"saveExternalPort\",\n] as const\n\nconst SIMPLE_ACTIONS = [\"start\", \"stop\", \"deploy\", \"rebuild\", \"remove\"] as const\ntype SimpleAction = (typeof SIMPLE_ACTIONS)[number]\n\nexport function registerDatabaseTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_database\",\n description:\n \"Manage databases (postgres/mysql/mariadb/mongo/redis). create: dbType+name+environmentId+databasePassword. get: dbType+databaseId. update: dbType+databaseId+fields. move: dbType+databaseId+targetEnvironmentId. start/stop/deploy/rebuild/remove: dbType+databaseId. reload: dbType+databaseId+appName. changeStatus: dbType+databaseId+applicationStatus. saveEnvironment: dbType+databaseId+env. saveExternalPort: dbType+databaseId+externalPort.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n dbType: dbTypeSchema,\n databaseId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n databaseName: z.string().optional(),\n databaseUser: z.string().optional(),\n databasePassword: z.string().optional(),\n databaseRootPassword: z.string().optional().describe(\"mysql/mariadb only\"),\n dockerImage: z.string().optional(),\n description: z.string().optional(),\n serverId: z.string().optional(),\n command: z.string().optional(),\n memoryLimit: z.number().optional(),\n cpuLimit: z.number().optional(),\n targetEnvironmentId: z.string().optional(),\n appName: z.string().optional(),\n applicationStatus: z.string().optional().describe(\"idle, running, done, or error\"),\n env: z.string().optional().describe(\"KEY=VALUE, newline separated\"),\n externalPort: z.number().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n const { dbType } = args\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = {}\n const createFields = [\n \"name\",\n \"environmentId\",\n \"databaseName\",\n \"databaseUser\",\n \"databasePassword\",\n \"databaseRootPassword\",\n \"dockerImage\",\n \"description\",\n \"serverId\",\n ] as const\n for (const key of createFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const db = await client.post<DokployDatabase>(`${dbType}.create`, body)\n return `# Database Created\\n\\n${formatDatabase(db, dbType)}`\n }\n case \"get\": {\n const db = await client.get<DokployDatabase>(`${dbType}.one`, {\n [dbIdField(dbType)]: args.databaseId!,\n })\n return `# Database Details\\n\\n${formatDatabase(db, dbType)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { [dbIdField(dbType)]: args.databaseId! }\n const updateFields = [\"name\", \"description\", \"dockerImage\", \"command\", \"memoryLimit\", \"cpuLimit\"] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(`${dbType}.update`, body)\n return `Database ${args.databaseId} (${dbType}) updated.`\n }\n case \"move\": {\n await client.post(`${dbType}.move`, {\n ...dbBody(dbType, args.databaseId!),\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Database ${args.databaseId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"start\":\n case \"stop\":\n case \"deploy\":\n case \"rebuild\":\n case \"remove\": {\n await client.post(`${dbType}.${args.action satisfies SimpleAction}`, dbBody(dbType, args.databaseId!))\n return `Database ${args.databaseId} (${dbType}): ${args.action} completed.`\n }\n case \"reload\": {\n await client.post(`${dbType}.reload`, {\n ...dbBody(dbType, args.databaseId!),\n appName: args.appName!,\n })\n return `Database ${args.databaseId} (${dbType}) reloaded.`\n }\n case \"changeStatus\": {\n await client.post(`${dbType}.changeStatus`, {\n ...dbBody(dbType, args.databaseId!),\n applicationStatus: args.applicationStatus!,\n })\n return `Database ${args.databaseId} status changed to ${args.applicationStatus}.`\n }\n case \"saveEnvironment\": {\n await client.post(`${dbType}.saveEnvironment`, {\n ...dbBody(dbType, args.databaseId!),\n ...(args.env !== undefined && { env: args.env }),\n })\n return `Environment saved for database ${args.databaseId}.`\n }\n case \"saveExternalPort\": {\n await client.post(`${dbType}.saveExternalPort`, {\n ...dbBody(dbType, args.databaseId!),\n externalPort: args.externalPort!,\n })\n return `External port set to ${args.externalPort} for database ${args.databaseId}.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployDeployment } from \"../types\"\nimport { formatDeploymentList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"killProcess\"] as const\n\nexport function registerDeploymentTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_deployment\",\n description: \"Manage deployments. list: applicationId|composeId|serverId|type+id. killProcess: deploymentId.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n deploymentId: z.string().optional(),\n applicationId: z.string().optional(),\n composeId: z.string().optional(),\n serverId: z.string().optional(),\n type: z.string().optional().describe(\"Resource type (application, compose, postgres, mysql, etc.)\"),\n id: z.string().optional().describe(\"Resource ID (used with type)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n let deployments: DokployDeployment[]\n\n if (args.applicationId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.all\", {\n applicationId: args.applicationId,\n })\n } else if (args.composeId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByCompose\", {\n composeId: args.composeId,\n })\n } else if (args.serverId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByServer\", {\n serverId: args.serverId,\n })\n } else if (args.type && args.id) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByType\", {\n type: args.type,\n id: args.id,\n })\n } else {\n throw new Error(\"Provide applicationId, composeId, serverId, or type+id\")\n }\n\n return formatDeploymentList(deployments)\n }\n case \"killProcess\": {\n await client.post(\"deployment.killProcess\", { deploymentId: args.deploymentId! })\n return `Deployment ${args.deploymentId} killed.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployContainer } from \"../types\"\nimport { formatContainerList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"getContainers\", \"restartContainer\", \"getConfig\", \"findContainers\"] as const\n\nexport function registerDockerTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_docker\",\n description:\n \"Docker management. getContainers: serverId?. restartContainer: containerId. getConfig: containerId, serverId?. findContainers: appName+method(match|label|stack|service), serverId?.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n containerId: z.string().optional(),\n serverId: z.string().optional(),\n appName: z.string().optional(),\n method: z.enum([\"match\", \"label\", \"stack\", \"service\"]).optional(),\n appType: z.string().optional().describe(\"App type filter (match method only)\"),\n type: z.string().optional().describe(\"Label type (label method only)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"getContainers\": {\n const containers = await client.get<DokployContainer[]>(\"docker.getContainers\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return formatContainerList(containers)\n }\n case \"restartContainer\": {\n await client.post(\"docker.restartContainer\", { containerId: args.containerId! })\n return `Container ${args.containerId} restarted.`\n }\n case \"getConfig\": {\n const config = await client.get<unknown>(\"docker.getConfig\", {\n containerId: args.containerId!,\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Container Config\\n\\n\\`\\`\\`json\\n${JSON.stringify(config, null, 2)}\\n\\`\\`\\``\n }\n case \"findContainers\": {\n const endpointMap: Record<string, string> = {\n match: \"docker.getContainersByAppNameMatch\",\n label: \"docker.getContainersByAppLabel\",\n stack: \"docker.getStackContainersByAppName\",\n service: \"docker.getServiceContainersByAppName\",\n }\n const method = args.method!\n const params: Record<string, string> = { appName: args.appName! }\n if (args.serverId) params.serverId = args.serverId\n if (args.appType && method === \"match\") params.appType = args.appType\n if (args.type && method === \"label\") params.type = args.type\n const containers = await client.get<DokployContainer[]>(endpointMap[method], params)\n return formatContainerList(containers)\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployDomain } from \"../types\"\nimport { formatDomain, formatDomainList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"list\", \"get\", \"update\", \"delete\", \"generate\", \"canGenerateTraefikMe\", \"validate\"] as const\n\nexport function registerDomainTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_domain\",\n description:\n \"Manage domains. create: host+applicationId|composeId. list: applicationId|composeId. get: domainId. update: domainId+host. delete: domainId. generate: appName. canGenerateTraefikMe: serverId?. validate: domain.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n domainId: z.string().optional(),\n host: z.string().optional(),\n applicationId: z.string().optional(),\n composeId: z.string().optional(),\n serviceName: z.string().optional(),\n path: z.string().optional(),\n port: z.number().optional(),\n https: z.boolean().optional(),\n certificateType: z.string().optional(),\n domainType: z.string().optional(),\n appName: z.string().optional(),\n serverId: z.string().optional(),\n domain: z.string().optional(),\n serverIp: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = { host: args.host! }\n const optionalFields = [\n \"applicationId\",\n \"composeId\",\n \"serviceName\",\n \"path\",\n \"port\",\n \"https\",\n \"certificateType\",\n \"domainType\",\n ] as const\n for (const key of optionalFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const domain = await client.post<DokployDomain>(\"domain.create\", body)\n return `# Domain Created\\n\\n${formatDomain(domain)}`\n }\n case \"list\": {\n let domains: DokployDomain[]\n if (args.applicationId) {\n domains = await client.get<DokployDomain[]>(\"domain.byApplicationId\", {\n applicationId: args.applicationId,\n })\n } else if (args.composeId) {\n domains = await client.get<DokployDomain[]>(\"domain.byComposeId\", { composeId: args.composeId })\n } else {\n throw new Error(\"Provide applicationId or composeId\")\n }\n return formatDomainList(domains)\n }\n case \"get\": {\n const domain = await client.get<DokployDomain>(\"domain.one\", { domainId: args.domainId! })\n return `# Domain Details\\n\\n${formatDomain(domain)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { domainId: args.domainId!, host: args.host! }\n const optionalFields = [\"path\", \"port\", \"https\", \"certificateType\"] as const\n for (const key of optionalFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"domain.update\", body)\n return `Domain ${args.domainId} updated.`\n }\n case \"delete\": {\n await client.post(\"domain.delete\", { domainId: args.domainId! })\n return `Domain ${args.domainId} deleted.`\n }\n case \"generate\": {\n const result = await client.post<unknown>(\"domain.generateDomain\", {\n appName: args.appName!,\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Generated Domain\\n\\n\\`\\`\\`json\\n${JSON.stringify(result, null, 2)}\\n\\`\\`\\``\n }\n case \"canGenerateTraefikMe\": {\n const result = await client.get<boolean>(\"domain.canGenerateTraefikMeDomains\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `Traefik.me: ${result ? \"Available\" : \"Not available\"}`\n }\n case \"validate\": {\n const result = await client.post<unknown>(\"domain.validateDomain\", {\n domain: args.domain!,\n ...(args.serverIp && { serverIp: args.serverIp }),\n })\n return `# DNS Validation: ${args.domain}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployEnvironment } from \"../types\"\nimport { formatEnvironment, formatEnvironmentList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"get\", \"list\", \"update\", \"remove\", \"duplicate\"] as const\n\nexport function registerEnvironmentTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_environment\",\n description:\n \"Manage project environments. create: projectId+name. get: environmentId. list: projectId. update: environmentId+fields. remove: environmentId. duplicate: environmentId+name.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n environmentId: z.string().optional(),\n projectId: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const env = await client.post<DokployEnvironment>(\"environment.create\", {\n name: args.name!,\n projectId: args.projectId!,\n ...(args.description && { description: args.description }),\n })\n return `# Environment Created\\n\\n${formatEnvironment(env)}`\n }\n case \"get\": {\n const env = await client.get<DokployEnvironment>(\"environment.one\", { environmentId: args.environmentId! })\n return `# Environment Details\\n\\n${formatEnvironment(env)}`\n }\n case \"list\": {\n const envs = await client.get<DokployEnvironment[]>(\"environment.byProjectId\", {\n projectId: args.projectId!,\n })\n return formatEnvironmentList(envs)\n }\n case \"update\": {\n await client.post(\"environment.update\", {\n environmentId: args.environmentId!,\n ...(args.name && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n })\n return `Environment ${args.environmentId} updated.`\n }\n case \"remove\": {\n await client.post(\"environment.remove\", { environmentId: args.environmentId! })\n return `Environment ${args.environmentId} removed.`\n }\n case \"duplicate\": {\n await client.post(\"environment.duplicate\", {\n environmentId: args.environmentId!,\n name: args.name!,\n ...(args.description && { description: args.description }),\n })\n return `Environment duplicated as \"${args.name}\".`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployCertificate, DokployPort, DokploySecurity } from \"../types\"\n\nconst ACTIONS = [\n \"createPort\",\n \"deletePort\",\n \"createAuth\",\n \"deleteAuth\",\n \"listCerts\",\n \"getCert\",\n \"createCert\",\n \"removeCert\",\n] as const\n\nexport function registerInfrastructureTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_infrastructure\",\n description:\n \"Manage ports, auth, certs. createPort: applicationId+publishedPort+targetPort. deletePort: portId. createAuth: applicationId+username+password. deleteAuth: securityId. listCerts: all. getCert: certificateId. createCert: name+certificateData+privateKey+organizationId. removeCert: certificateId.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n applicationId: z.string().optional(),\n publishedPort: z.number().optional(),\n targetPort: z.number().optional(),\n protocol: z.string().optional(),\n publishMode: z.string().optional(),\n portId: z.string().optional(),\n username: z.string().optional(),\n password: z.string().optional(),\n securityId: z.string().optional(),\n certificateId: z.string().optional(),\n name: z.string().optional(),\n certificateData: z.string().optional().describe(\"PEM format\"),\n privateKey: z.string().optional().describe(\"PEM format\"),\n organizationId: z.string().optional(),\n autoRenew: z.boolean().optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"createPort\": {\n const port = await client.post<DokployPort>(\"port.create\", {\n applicationId: args.applicationId!,\n publishedPort: args.publishedPort!,\n targetPort: args.targetPort!,\n ...(args.protocol && { protocol: args.protocol }),\n ...(args.publishMode && { publishMode: args.publishMode }),\n })\n return `Port mapping created: ${port.publishedPort} -> ${port.targetPort} (ID: ${port.portId})`\n }\n case \"deletePort\": {\n await client.post(\"port.delete\", { portId: args.portId! })\n return `Port mapping ${args.portId} deleted.`\n }\n case \"createAuth\": {\n const security = await client.post<DokploySecurity>(\"security.create\", {\n applicationId: args.applicationId!,\n username: args.username!,\n password: args.password!,\n })\n return `Basic auth created for application ${args.applicationId} (ID: ${security.securityId})`\n }\n case \"deleteAuth\": {\n await client.post(\"security.delete\", { securityId: args.securityId! })\n return `Security credentials ${args.securityId} deleted.`\n }\n case \"listCerts\": {\n const certs = await client.get<DokployCertificate[]>(\"certificates.all\")\n if (certs.length === 0) return \"No certificates found.\"\n const lines = certs.map(\n (c) => `- **${c.name}** (ID: ${c.certificateId}) | Auto-renew: ${c.autoRenew ?? \"N/A\"}`,\n )\n return `# Certificates (${certs.length})\\n\\n${lines.join(\"\\n\")}`\n }\n case \"getCert\": {\n const cert = await client.get<DokployCertificate>(\"certificates.one\", {\n certificateId: args.certificateId!,\n })\n return `# Certificate: ${cert.name}\\n\\n- ID: ${cert.certificateId}\\n- Auto-renew: ${cert.autoRenew ?? \"N/A\"}`\n }\n case \"createCert\": {\n const body: Record<string, unknown> = {\n name: args.name!,\n certificateData: args.certificateData!,\n privateKey: args.privateKey!,\n organizationId: args.organizationId!,\n }\n if (args.autoRenew !== undefined) body.autoRenew = args.autoRenew\n if (args.serverId) body.serverId = args.serverId\n const cert = await client.post<DokployCertificate>(\"certificates.create\", body)\n return `Certificate \"${cert.name}\" created (ID: ${cert.certificateId}).`\n }\n case \"removeCert\": {\n await client.post(\"certificates.remove\", { certificateId: args.certificateId! })\n return `Certificate ${args.certificateId} removed.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployProject } from \"../types\"\nimport { formatProject, formatProjectList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"get\", \"create\", \"update\", \"remove\", \"duplicate\"] as const\n\nexport function registerProjectTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_project\",\n description:\n \"Manage projects. list: all. get: projectId. create: name. update: projectId+fields. remove: projectId. duplicate: sourceEnvironmentId+name.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n projectId: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n sourceEnvironmentId: z.string().optional(),\n includeServices: z.boolean().optional(),\n duplicateInSameProject: z.boolean().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n const projects = await client.get<DokployProject[]>(\"project.all\")\n return formatProjectList(projects)\n }\n case \"get\": {\n const project = await client.get<DokployProject>(\"project.one\", { projectId: args.projectId! })\n return `# Project Details\\n\\n${formatProject(project)}`\n }\n case \"create\": {\n const project = await client.post<DokployProject>(\"project.create\", {\n name: args.name!,\n ...(args.description && { description: args.description }),\n })\n return `# Project Created\\n\\n${formatProject(project)}`\n }\n case \"update\": {\n await client.post(\"project.update\", {\n projectId: args.projectId!,\n ...(args.name && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n })\n return `Project ${args.projectId} updated.`\n }\n case \"remove\": {\n await client.post(\"project.remove\", { projectId: args.projectId! })\n return `Project ${args.projectId} removed.`\n }\n case \"duplicate\": {\n await client.post(\"project.duplicate\", {\n sourceEnvironmentId: args.sourceEnvironmentId!,\n name: args.name!,\n ...(args.description && { description: args.description }),\n ...(args.includeServices !== undefined && { includeServices: args.includeServices }),\n ...(args.duplicateInSameProject !== undefined && { duplicateInSameProject: args.duplicateInSameProject }),\n })\n return `Environment duplicated as \"${args.name}\".`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployServer } from \"../types\"\nimport { formatServer, formatServerList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"get\", \"create\", \"update\", \"remove\", \"count\", \"publicIp\", \"getMetrics\"] as const\n\nexport function registerServerTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_server\",\n description:\n \"Manage servers. list/count/publicIp: no params. get: serverId. create: name+ipAddress+port+username+sshKeyId+serverType. update: serverId+fields. remove: serverId. getMetrics: url+token.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n serverId: z.string().optional(),\n name: z.string().optional(),\n ipAddress: z.string().optional(),\n port: z.number().optional(),\n username: z.string().optional(),\n sshKeyId: z.string().optional(),\n serverType: z.string().optional(),\n description: z.string().optional(),\n url: z.string().optional(),\n token: z.string().optional(),\n dataPoints: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n const servers = await client.get<DokployServer[]>(\"server.all\")\n return formatServerList(servers)\n }\n case \"get\": {\n const srv = await client.get<DokployServer>(\"server.one\", { serverId: args.serverId! })\n return `# Server Details\\n\\n${formatServer(srv)}`\n }\n case \"create\": {\n const srv = await client.post<DokployServer>(\"server.create\", {\n name: args.name!,\n ipAddress: args.ipAddress!,\n port: args.port!,\n username: args.username!,\n sshKeyId: args.sshKeyId!,\n serverType: args.serverType!,\n ...(args.description && { description: args.description }),\n })\n return `# Server Created\\n\\n${formatServer(srv)}`\n }\n case \"update\": {\n await client.post(\"server.update\", {\n serverId: args.serverId!,\n name: args.name!,\n ipAddress: args.ipAddress!,\n port: args.port!,\n username: args.username!,\n sshKeyId: args.sshKeyId!,\n serverType: args.serverType!,\n ...(args.description && { description: args.description }),\n })\n return `Server ${args.serverId} updated.`\n }\n case \"remove\": {\n await client.post(\"server.remove\", { serverId: args.serverId! })\n return `Server ${args.serverId} removed.`\n }\n case \"count\": {\n const count = await client.get<number>(\"server.count\")\n return `Total servers: ${count}`\n }\n case \"publicIp\": {\n const ip = await client.get<string>(\"server.publicIp\")\n return `Public IP: ${ip}`\n }\n case \"getMetrics\": {\n const metrics = await client.get<unknown>(\"server.getServerMetrics\", {\n url: args.url!,\n token: args.token!,\n ...(args.dataPoints && { dataPoints: args.dataPoints }),\n })\n return `# Server Metrics\\n\\n\\`\\`\\`json\\n${JSON.stringify(metrics, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\n\nconst ACTIONS = [\"health\", \"version\", \"ip\", \"clean\", \"reload\"] as const\n\nexport function registerSettingsTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_settings\",\n description:\n \"System settings. health: check status. version: get version. ip: get IP. clean: cleanType (all|images), serverId?. reload: reloadTarget (server|traefik), serverId?.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n cleanType: z.enum([\"all\", \"images\"]).optional(),\n reloadTarget: z.enum([\"server\", \"traefik\"]).optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"health\": {\n const health = await client.get<unknown>(\"settings.health\")\n return `# Health\\n\\n\\`\\`\\`json\\n${JSON.stringify(health, null, 2)}\\n\\`\\`\\``\n }\n case \"version\": {\n const version = await client.get<string>(\"settings.getDokployVersion\")\n return `Dokploy version: ${version}`\n }\n case \"ip\": {\n const ip = await client.get<string>(\"settings.getIp\")\n return `Server IP: ${ip}`\n }\n case \"clean\": {\n const type = args.cleanType ?? \"all\"\n const endpoint = type === \"all\" ? \"settings.cleanAll\" : \"settings.cleanUnusedImages\"\n await client.post(endpoint, {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `Cleanup (${type}) completed.`\n }\n case \"reload\": {\n const target = args.reloadTarget ?? \"server\"\n if (target === \"server\") {\n await client.post(\"settings.reloadServer\")\n } else {\n await client.post(\"settings.reloadTraefik\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n }\n return `${target} reloaded.`\n }\n }\n },\n })\n}\n","import dotenv from \"dotenv\"\nimport { FastMCP } from \"fastmcp\"\n\nimport { initializeDokployClient } from \"./client/dokploy-client\"\nimport {\n registerApplicationTools,\n registerBackupTools,\n registerComposeTools,\n registerDatabaseTools,\n registerDeploymentTools,\n registerDockerTools,\n registerDomainTools,\n registerEnvironmentTools,\n registerInfrastructureTools,\n registerProjectTools,\n registerServerTools,\n registerSettingsTools,\n} from \"./tools\"\n\ndotenv.config()\n\ndeclare const __VERSION__: string\nconst VERSION = (typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"0.0.0-dev\") as `${number}.${number}.${number}`\n\nfunction setupDokployClient() {\n const baseUrl = process.env.DOKPLOY_URL\n const apiKey = process.env.DOKPLOY_API_KEY\n\n if (!baseUrl) {\n console.error(\"[Error] DOKPLOY_URL environment variable is required\")\n console.error(\"[Error] Set it to your Dokploy instance URL (e.g., https://dokploy.example.com)\")\n process.exit(1)\n }\n\n if (!apiKey) {\n console.error(\"[Error] DOKPLOY_API_KEY environment variable is required\")\n console.error(\"[Error] Generate an API key in Dokploy Settings > API Keys\")\n process.exit(1)\n }\n\n initializeDokployClient(baseUrl, apiKey)\n console.error(`[Setup] Dokploy client initialized for ${baseUrl}`)\n}\n\nconst server = new FastMCP({\n name: \"dokploy-mcp-server\",\n version: VERSION,\n instructions: `A comprehensive Dokploy MCP server for managing deployments, applications, databases, domains, and infrastructure.\n\nAvailable capabilities:\n- Projects: list, create, update, remove, duplicate\n- Applications: create, deploy, redeploy, start, stop, delete, configure builds, manage environment variables\n- Docker Compose: create, deploy, start, stop, manage services\n- Databases: unified tools for postgres, mysql, mariadb, mongo, redis (create, deploy, start, stop, manage)\n- Domains: create, configure, validate DNS, generate traefik.me domains\n- Docker: list containers, restart, inspect configuration\n- Servers: add, configure, monitor remote servers\n- Deployments: list, track, kill deployment processes\n- Backups: schedule, trigger manual backups, list backup files\n- Environments: create, duplicate, manage project environments\n- Infrastructure: ports, certificates, basic auth security\n- Settings: health checks, version info, cleanup, reload services`,\n})\n\nregisterProjectTools(server)\nregisterApplicationTools(server)\nregisterComposeTools(server)\nregisterDeploymentTools(server)\nregisterDockerTools(server)\nregisterDomainTools(server)\nregisterServerTools(server)\nregisterSettingsTools(server)\nregisterDatabaseTools(server)\nregisterBackupTools(server)\nregisterEnvironmentTools(server)\nregisterInfrastructureTools(server)\n\nasync function main() {\n try {\n setupDokployClient()\n\n const useHttp = process.env.TRANSPORT_TYPE === \"httpStream\" || process.env.TRANSPORT_TYPE === \"http\"\n const port = parseInt(process.env.PORT || \"3000\")\n const host = process.env.HOST || \"0.0.0.0\"\n\n if (useHttp) {\n console.error(`[Setup] Starting HTTP server on ${host}:${port}`)\n await server.start({\n transportType: \"httpStream\",\n httpStream: {\n port,\n host,\n endpoint: \"/mcp\",\n },\n })\n console.error(`[Setup] HTTP server ready at http://${host}:${port}/mcp`)\n } else {\n console.error(\"[Setup] Starting in stdio mode\")\n await server.start({\n transportType: \"stdio\",\n })\n }\n } catch (error) {\n console.error(\"[Error] Failed to start server:\", error)\n process.exit(1)\n }\n}\n\nprocess.on(\"SIGINT\", () => {\n console.error(\"[Shutdown] Shutting down Dokploy MCP Server...\")\n process.exit(0)\n})\n\nprocess.on(\"SIGTERM\", () => {\n console.error(\"[Shutdown] Shutting down Dokploy MCP Server...\")\n process.exit(0)\n})\n\nmain().catch(console.error)\n"],"mappings":";;;;;AAMA,IAAa,gBAAb,MAA2B;CACzB,AAAQ;CACR,AAAQ;CAER,YAAY,SAAiB,QAAgB;AAC3C,OAAK,UAAU,QAAQ,QAAQ,QAAQ,GAAG;AAC1C,OAAK,SAAS;;CAGhB,MAAM,IAAO,MAAc,QAA4E;AACrG,SAAO,KAAK,QAAW,MAAM;GAAE,QAAQ;GAAO;GAAQ,CAAC;;CAGzD,MAAM,KAAQ,MAAc,MAA4C;AACtE,SAAO,KAAK,QAAW,MAAM;GAAE,QAAQ;GAAQ;GAAM,CAAC;;CAGxD,MAAc,QAAW,MAAc,SAAqC;EAC1E,MAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAEjD,MAAI,QAAQ,QACV;QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,CACvD,KAAI,UAAU,OACZ,KAAI,aAAa,IAAI,KAAK,OAAO,MAAM,CAAC;;EAK9C,MAAM,UAAkC;GACtC,aAAa,KAAK;GAClB,QAAQ;GACT;EAED,MAAM,OAAoB;GACxB,QAAQ,QAAQ;GAChB;GACD;AAED,MAAI,QAAQ,MAAM;AAChB,WAAQ,kBAAkB;AAC1B,QAAK,OAAO,KAAK,UAAU,QAAQ,KAAK;;EAG1C,MAAM,WAAW,MAAM,MAAM,IAAI,UAAU,EAAE,KAAK;AAElD,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;AACpE,SAAM,IAAI,MACR,sBAAsB,SAAS,OAAO,GAAG,SAAS,WAAW,OAAO,QAAQ,OAAO,IAAI,KAAK,IAAI,YACjG;;EAGH,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,MAAI,CAAC,KACH;AAGF,SAAO,KAAK,MAAM,KAAK;;;AAI3B,IAAI;AAEJ,SAAgB,wBAAwB,SAAiB,QAA+B;AACtF,UAAS,IAAI,cAAc,SAAS,OAAO;AAC3C,QAAO;;AAGT,SAAgB,mBAAkC;AAChD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,wGACD;AAEH,QAAO;;;;;ACnET,SAAS,WAAW,SAA0B;AAC5C,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI;AACF,SAAO,IAAI,KAAK,QAAQ,CACrB,aAAa,CACb,QAAQ,KAAK,IAAI,CACjB,QAAQ,WAAW,OAAO;SACvB;AACN,SAAO;;;AAIX,SAAS,WAAW,QAAwB;CAC1C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,aAAa,MAAM,UAAU,MAAM,OAAQ,QAAO;AAC5D,KAAI,MAAM,WAAW,MAAM,SAAU,QAAO;AAC5C,KAAI,MAAM,UAAW,QAAO;AAC5B,QAAO,IAAI,OAAO,aAAa,CAAC;;AAGlC,SAAgB,cAAc,SAAiC;;CAC7D,MAAM,qCAAW,QAAQ,4FAAc,WAAU;AACjD,QAAO,OAAO,QAAQ,KAAK,UAAU,QAAQ,UAAU;iBACxC,QAAQ,eAAe,OAAO;kBAC7B,SAAS;aACd,WAAW,QAAQ,UAAU;;AAG1C,SAAgB,kBAAkB,UAAoC;AACpE,KAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAO,eAAe,SAAS,OAAO,OAAO,SAAS,IAAI,cAAc,CAAC,KAAK,OAAO;;AAGvF,SAAgB,kBAAkB,KAAiC;AACjE,QAAO,OAAO,IAAI,KAAK,UAAU,IAAI,cAAc;iBACpC,IAAI,eAAe,OAAO;aAC9B,IAAI,UAAU;aACd,WAAW,IAAI,UAAU;;AAGtC,SAAgB,sBAAsB,MAAoC;AACxE,KAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAO,mBAAmB,KAAK,OAAO,OAAO,KAAK,IAAI,kBAAkB,CAAC,KAAK,OAAO;;AAGvF,SAAgB,kBAAkB,KAAiC;AACjE,QAAO,OAAO,IAAI,KAAK,KAAK,WAAW,IAAI,kBAAkB,CAAC,QAAQ,IAAI,cAAc;cAC5E,IAAI,QAAQ;iBACT,IAAI,eAAe,OAAO;gBAC3B,IAAI,aAAa,MAAM;YAC3B,IAAI,cAAc,MAAM;iBACnB,IAAI,cAAc,MAAM;aAC5B,WAAW,IAAI,UAAU;;AAGtC,SAAgB,iBAAiB,KAAgC;AAC/D,QAAO,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,aAAa,UAAU,IAAI,aAAa;YACnF,IAAI,OAAO;iBACN,IAAI,eAAe,OAAO;aAC9B,WAAW,IAAI,UAAU;;AAGtC,SAAgB,qBAAqB,aAA0C;AAC7E,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAO,kBAAkB,YAAY,OAAO,OAAO,YAAY,IAAI,iBAAiB,CAAC,KAAK,OAAO;;AAGnG,SAAgB,cAAc,SAAiC;AAC7D,QAAO,OAAO,QAAQ,KAAK,KAAK,WAAW,QAAQ,cAAc,CAAC,QAAQ,QAAQ,UAAU;cAChF,QAAQ,QAAQ;iBACb,QAAQ,eAAe,OAAO;UACrC,QAAQ,eAAe,MAAM;YAC3B,QAAQ,cAAc,MAAM;aAC3B,WAAW,QAAQ,UAAU;;AAG1C,SAAgB,aAAa,QAA+B;AAE1D,QAAO,OADU,OAAO,QAAQ,UAAU,OACnB,KAAK,OAAO,OAAO,OAAO,QAAQ,GAAG,UAAU,OAAO,SAAS;UAC9E,OAAO,QAAQ,UAAU;WACxB,OAAO,MAAM;iBACP,OAAO,mBAAmB,OAAO;UACxC,OAAO,cAAc,MAAM;aACxB,OAAO,eAAe;;AAGnC,SAAgB,iBAAiB,SAAkC;AACjE,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAO,cAAc,QAAQ,OAAO,OAAO,QAAQ,IAAI,aAAa,CAAC,KAAK,OAAO;;AAGnF,SAAgB,aAAa,QAA+B;AAC1D,QAAO,OAAO,OAAO,KAAK,UAAU,OAAO,SAAS;iBACrC,OAAO,eAAe,OAAO;QACtC,OAAO,UAAU,GAAG,OAAO,KAAK;UAC9B,OAAO,SAAS;UAChB,OAAO,WAAW;aACf,WAAW,OAAO,UAAU;;AAGzC,SAAgB,iBAAiB,SAAkC;AACjE,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAO,cAAc,QAAQ,OAAO,OAAO,QAAQ,IAAI,aAAa,CAAC,KAAK,OAAO;;AAGnF,SAAgB,eAAe,IAAqB,QAAwB;AAC1E,QAAO,OAAO,GAAG,KAAK,KAAK,WAAW,GAAG,kBAAkB,CAAC,QAAQ,GAAG,WAAW;UAC1E,OAAO;cACH,GAAG,QAAQ;iBACR,GAAG,eAAe,OAAO;mBACvB,GAAG,gBAAgB,MAAM;WACjC,GAAG,eAAe,UAAU;mBACpB,GAAG,gBAAgB,OAAO;aAChC,WAAW,GAAG,UAAU;;AAGrC,SAAgB,gBAAgB,WAAqC;;AACnE,QAAO,OAAO,UAAU,KAAK,2BAAM,UAAU,2EAAO,aAAa,KAAI,UAAU;QACzE,UAAU,YAAY;WACnB,UAAU,MAAM;YACf,UAAU,OAAO;WAClB,UAAU,SAAS;;AAG9B,SAAgB,oBAAoB,YAAwC;AAC1E,KAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAO,iBAAiB,WAAW,OAAO,OAAO,WAAW,IAAI,gBAAgB,CAAC,KAAK,OAAO;;AAG/F,SAAgB,aAAa,QAA+B;AAC1D,QAAO,OAAO,OAAO,OAAO,UAAU,OAAO,SAAS;cAC1C,OAAO,SAAS;aACjB,OAAO,WAAW,KAAK;cACtB,OAAO,SAAS;UACpB,OAAO,aAAa;iBACb,OAAO,cAAc;iBACrB,OAAO,mBAAmB;;;;;AC9I3C,MAAMA,aAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAcD,SAAgB,yBAAyB,QAAiB;AACxD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,WAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,UAAU,EAAE,SAAS,CAAC,UAAU;GAChC,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qDAAqD;GACvG,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,SAAS,CAAC,UAAU;GAClC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qCAAqC;GACzE,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,eAAe,EAAE,SAAS,CAAC,UAAU;GACrC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;GACxC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,4CAA4C;GAC3F,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SAOH,QAAO,4BAA4B,kBANvB,MAAM,OAAO,KAAyB,sBAAsB;KACtE,MAAM,KAAK;KACX,eAAe,KAAK;KACpB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;KACjD,CAAC,CACuD;IAE3D,KAAK,MAIH,QAAO,4BAA4B,kBAHvB,MAAM,OAAO,IAAwB,mBAAmB,EAClE,eAAe,KAAK,eACrB,CAAC,CACuD;IAE3D,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,eAAe,KAAK,eAAgB;AAW5E,UAAK,MAAM,OAVU;MACnB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,sBAAsB,KAAK;AAC7C,YAAO,eAAe,KAAK,cAAc;;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,oBAAoB;MACpC,eAAe,KAAK;MACpB,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,eAAe,KAAK,cAAc,wBAAwB,KAAK,oBAAoB;IAE5F,KAAK,UAAU;KACb,MAAM,WAAW,KAAK,WAAW,yBAAyB;AAC1D,WAAM,OAAO,KAAK,UAAU;MAC1B,eAAe,KAAK;MACpB,GAAI,KAAK,SAAS,EAAE,OAAO,KAAK,OAAO;MACvC,GAAI,KAAK,qBAAqB,EAAE,aAAa,KAAK,mBAAmB;MACtE,CAAC;AACF,YAAO,GAAG,KAAK,WAAW,iBAAiB,aAAa,6BAA6B,KAAK,cAAc;;IAE1G,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,eAAe,KAAK,UAAiC,EACrE,eAAe,KAAK,eACrB,CAAC;AACF,YAAO,eAAe,KAAK,cAAc,IAAI,KAAK,OAAO;IAE3D,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB;MACtC,eAAe,KAAK;MACpB,SAAS,KAAK;MACf,CAAC;AACF,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,+BAA+B;MAC/C,eAAe,KAAK;MACpB,eAAe,KAAK,iBAAiB;MACrC,GAAI,KAAK,QAAQ,UAAa,EAAE,KAAK,KAAK,KAAK;MAC/C,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,WAAW;MAClE,CAAC;AACF,YAAO,qCAAqC,KAAK,cAAc;IAEjE,KAAK;AACH,WAAM,OAAO,KAAK,6BAA6B;MAC7C,eAAe,KAAK;MACpB,WAAW,KAAK;MAChB,mBAAmB,KAAK,qBAAqB;MAC7C,kBAAkB,KAAK,oBAAoB;MAC3C,GAAI,KAAK,cAAc,EAAE,YAAY,KAAK,YAAY;MACtD,GAAI,KAAK,oBAAoB,EAAE,kBAAkB,KAAK,kBAAkB;MACzE,CAAC;AACF,YAAO,sBAAsB,KAAK,UAAU,oBAAoB,KAAK,cAAc;IAErF,KAAK;AACH,SAAI,KAAK,eAAe;AACtB,YAAM,OAAO,KAAK,mCAAmC;OACnD,eAAe,KAAK;OACpB,eAAe,KAAK;OACrB,CAAC;AACF,aAAO,0CAA0C,KAAK,cAAc;;AAKtE,YAAO,mCAHQ,MAAM,OAAO,IAAY,iCAAiC,EACvE,eAAe,KAAK,eACrB,CAAC,CAC+C;IAEnD,KAAK,kBAAkB;KACrB,MAAM,OAAO,MAAM,OAAO,IAAa,iCAAiC,EAAE,SAAS,KAAK,SAAU,CAAC;AACnG,YAAO,iBAAiB,KAAK,QAAQ,kBAAkB,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;;;;EAI5F,CAAC;;;;;AClLJ,MAAMC,aAAU;CAAC;CAAU;CAAO;CAAU;CAAU;CAAa;CAAe;AAElF,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,WAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,kBAAkB;GAC3D,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qCAAqC;GAClF,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,SAAS,EAAE,SAAS,CAAC,UAAU;GAC/B,iBAAiB,EAAE,QAAQ,CAAC,UAAU;GACtC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,YAAY,EAAE,KAAK;IAAC;IAAY;IAAS;IAAW;IAAS;IAAU,CAAC,CAAC,UAAU;GACnF,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAgBxC,UAAK,MAAM,OAfI;MACb;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,uBAAuB,aADf,MAAM,OAAO,KAAoB,iBAAiB,KAAK,CACpB;;IAEpD,KAAK,MAEH,QAAO,uBAAuB,aADf,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEpD,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAYxC,UAAK,MAAM,OAXI;MACb;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,iBAAiB,KAAK;AACxC,YAAO,UAAU,KAAK,SAAS;;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,aAAa;KAChB,MAAM,QAAQ,MAAM,OAAO,IAAa,0BAA0B;MAChE,eAAe,KAAK;MACpB,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,QAAQ;MAC1C,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,iCAAiC,KAAK,UAAU,OAAO,MAAM,EAAE,CAAC;;IAEzE,KAAK,gBAAgB;KAQnB,MAAM,WAPsC;MAC1C,UAAU;MACV,OAAO;MACP,SAAS;MACT,OAAO;MACP,SAAS;MACV,CAC4B,KAAK;AAClC,WAAM,OAAO,KAAK,UAAU,EAAE,UAAU,KAAK,UAAW,CAAC;AACzD,YAAO,UAAU,KAAK,WAAW,sCAAsC,KAAK,SAAS;;;;EAI5F,CAAC;;;;;ACvGJ,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,qBAAqB,QAAiB;AACpD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,0BAA0B;GACtE,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,KAAK,EAAE,QAAQ,CAAC,UAAU;GAC1B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,eAAe,EAAE,SAAS,CAAC,UAAU;GACrC,UAAU,EAAE,SAAS,CAAC,UAAU;GAChC,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU;GACxC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GACnC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SASH,QAAO,wBAAwB,cARf,MAAM,OAAO,KAAqB,kBAAkB;KAClE,MAAM,KAAK;KACX,eAAe,KAAK;KACpB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;KACjD,CAAC,CACmD;IAEvD,KAAK,MAEH,QAAO,wBAAwB,cADf,MAAM,OAAO,IAAoB,eAAe,EAAE,WAAW,KAAK,WAAY,CAAC,CAC1C;IAEvD,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,WAAW,KAAK,WAAY;AAEpE,UAAK,MAAM,OADU;MAAC;MAAQ;MAAe;MAAe;MAAO;MAAU,CAE3E,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,kBAAkB,KAAK;AACzC,YAAO,WAAW,KAAK,UAAU;;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB;MAClC,WAAW,KAAK;MAChB,eAAe,KAAK,iBAAiB;MACtC,CAAC;AACF,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK,UAAU;KACb,MAAM,WAAW,KAAK,WAAW,qBAAqB;AACtD,WAAM,OAAO,KAAK,UAAU;MAC1B,WAAW,KAAK;MAChB,GAAI,KAAK,SAAS,EAAE,OAAO,KAAK,OAAO;MACvC,GAAI,KAAK,qBAAqB,EAAE,aAAa,KAAK,mBAAmB;MACtE,CAAC;AACF,YAAO,GAAG,KAAK,WAAW,iBAAiB,aAAa,yBAAyB,KAAK,UAAU;;IAElG,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,WAAW,KAAK,UAAU,EAAE,WAAW,KAAK,WAAY,CAAC;AAC3E,YAAO,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO;IAEnD,KAAK;AACH,WAAM,OAAO,KAAK,gBAAgB;MAChC,WAAW,KAAK;MAChB,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,WAAW,KAAK,UAAU,wBAAwB,KAAK,oBAAoB;IAEpF,KAAK,gBAAgB;KACnB,MAAM,WAAW,MAAM,OAAO,IAAa,wBAAwB;MACjE,WAAW,KAAK;MAChB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACrC,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;IAEhF,KAAK,cAAc;KACjB,MAAM,SAAS,MAAM,OAAO,IAAa,+BAA+B;MACtE,WAAW,KAAK;MAChB,aAAa,KAAK;MACnB,CAAC;AACF,YAAO,aAAa,KAAK,YAAY,kBAAkB,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAEzF,KAAK,oBAEH,QAAO,oBADS,MAAM,OAAO,IAAY,6BAA6B,EAAE,WAAW,KAAK,WAAY,CAAC;;;EAK5G,CAAC;;;;;ACzHJ,MAAa,WAAW;CAAC;CAAY;CAAS;CAAW;CAAS;CAAQ;AAG1E,MAAa,eAA6C;CACxD,UAAU;CACV,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACR;;;;ACDD,MAAM,eAAe,EAAE,KAAK,SAAS,CAAC,SAAS,4CAA4C;AAE3F,SAAS,UAAU,QAA8B;AAC/C,QAAO,aAAa;;AAGtB,SAAS,OAAO,QAAsB,YAA6C;AACjF,QAAO,GAAG,UAAU,OAAO,GAAG,YAAY;;AAG5C,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAKD,SAAgB,sBAAsB,QAAiB;AACrD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,QAAQ;GACR,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qBAAqB;GAC1E,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,gCAAgC;GAClF,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,+BAA+B;GACnE,cAAc,EAAE,QAAQ,CAAC,UAAU;GACpC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;GACjC,MAAM,EAAE,WAAW;AAEnB,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAYxC,UAAK,MAAM,OAXU;MACnB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,yBAAyB,eADrB,MAAM,OAAO,KAAsB,GAAG,OAAO,UAAU,KAAK,EACpB,OAAO;;IAE5D,KAAK,MAIH,QAAO,yBAAyB,eAHrB,MAAM,OAAO,IAAqB,GAAG,OAAO,OAAO,GAC3D,UAAU,OAAO,GAAG,KAAK,YAC3B,CAAC,EACiD,OAAO;IAE5D,KAAK,UAAU;KACb,MAAM,OAAgC,GAAG,UAAU,OAAO,GAAG,KAAK,YAAa;AAE/E,UAAK,MAAM,OADU;MAAC;MAAQ;MAAe;MAAe;MAAW;MAAe;MAAW,CAE/F,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,GAAG,OAAO,UAAU,KAAK;AAC3C,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO;;IAEhD,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,QAAQ;MAClC,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,wBAAwB,KAAK,oBAAoB;IAEtF,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,GAAG,KAAK,UAAiC,OAAO,QAAQ,KAAK,WAAY,CAAC;AACtG,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,OAAO;IAEjE,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,UAAU;MACpC,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,SAAS,KAAK;MACf,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO;IAEhD,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,gBAAgB;MAC1C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,mBAAmB,KAAK;MACzB,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,qBAAqB,KAAK,kBAAkB;IAEjF,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,mBAAmB;MAC7C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,GAAI,KAAK,QAAQ,UAAa,EAAE,KAAK,KAAK,KAAK;MAChD,CAAC;AACF,YAAO,kCAAkC,KAAK,WAAW;IAE3D,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,oBAAoB;MAC9C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,cAAc,KAAK;MACpB,CAAC;AACF,YAAO,wBAAwB,KAAK,aAAa,gBAAgB,KAAK,WAAW;;;EAIxF,CAAC;;;;;AC7IJ,MAAMC,YAAU,CAAC,QAAQ,cAAc;AAEvC,SAAgB,wBAAwB,QAAiB;AACvD,QAAO,QAAQ;EACb,MAAM;EACN,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,8DAA8D;GACnG,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,+BAA+B;GACnE,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,QAAQ;KACX,IAAI;AAEJ,SAAI,KAAK,cACP,eAAc,MAAM,OAAO,IAAyB,kBAAkB,EACpE,eAAe,KAAK,eACrB,CAAC;cACO,KAAK,UACd,eAAc,MAAM,OAAO,IAAyB,2BAA2B,EAC7E,WAAW,KAAK,WACjB,CAAC;cACO,KAAK,SACd,eAAc,MAAM,OAAO,IAAyB,0BAA0B,EAC5E,UAAU,KAAK,UAChB,CAAC;cACO,KAAK,QAAQ,KAAK,GAC3B,eAAc,MAAM,OAAO,IAAyB,wBAAwB;MAC1E,MAAM,KAAK;MACX,IAAI,KAAK;MACV,CAAC;SAEF,OAAM,IAAI,MAAM,yDAAyD;AAG3E,YAAO,qBAAqB,YAAY;;IAE1C,KAAK;AACH,WAAM,OAAO,KAAK,0BAA0B,EAAE,cAAc,KAAK,cAAe,CAAC;AACjF,YAAO,cAAc,KAAK,aAAa;;;EAI9C,CAAC;;;;;ACnDJ,MAAMC,YAAU;CAAC;CAAiB;CAAoB;CAAa;CAAiB;AAEpF,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,QAAQ,EAAE,KAAK;IAAC;IAAS;IAAS;IAAS;IAAU,CAAC,CAAC,UAAU;GACjE,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,sCAAsC;GAC9E,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,iCAAiC;GACvE,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,gBAIH,QAAO,oBAHY,MAAM,OAAO,IAAwB,wBAAwB,EAC9E,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC,CACoC;IAExC,KAAK;AACH,WAAM,OAAO,KAAK,2BAA2B,EAAE,aAAa,KAAK,aAAc,CAAC;AAChF,YAAO,aAAa,KAAK,YAAY;IAEvC,KAAK,aAAa;KAChB,MAAM,SAAS,MAAM,OAAO,IAAa,oBAAoB;MAC3D,aAAa,KAAK;MAClB,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAE9E,KAAK,kBAAkB;KACrB,MAAM,cAAsC;MAC1C,OAAO;MACP,OAAO;MACP,OAAO;MACP,SAAS;MACV;KACD,MAAM,SAAS,KAAK;KACpB,MAAM,SAAiC,EAAE,SAAS,KAAK,SAAU;AACjE,SAAI,KAAK,SAAU,QAAO,WAAW,KAAK;AAC1C,SAAI,KAAK,WAAW,WAAW,QAAS,QAAO,UAAU,KAAK;AAC9D,SAAI,KAAK,QAAQ,WAAW,QAAS,QAAO,OAAO,KAAK;AAExD,YAAO,oBADY,MAAM,OAAO,IAAwB,YAAY,SAAS,OAAO,CAC9C;;;;EAI7C,CAAC;;;;;ACtDJ,MAAMC,YAAU;CAAC;CAAU;CAAQ;CAAO;CAAU;CAAU;CAAY;CAAwB;CAAW;AAE7G,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,OAAO,EAAE,SAAS,CAAC,UAAU;GAC7B,iBAAiB,EAAE,QAAQ,CAAC,UAAU;GACtC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,MAAM,KAAK,MAAO;AAW1D,UAAK,MAAM,OAVY;MACrB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,uBAAuB,aADf,MAAM,OAAO,KAAoB,iBAAiB,KAAK,CACpB;;IAEpD,KAAK,QAAQ;KACX,IAAI;AACJ,SAAI,KAAK,cACP,WAAU,MAAM,OAAO,IAAqB,0BAA0B,EACpE,eAAe,KAAK,eACrB,CAAC;cACO,KAAK,UACd,WAAU,MAAM,OAAO,IAAqB,sBAAsB,EAAE,WAAW,KAAK,WAAW,CAAC;SAEhG,OAAM,IAAI,MAAM,qCAAqC;AAEvD,YAAO,iBAAiB,QAAQ;;IAElC,KAAK,MAEH,QAAO,uBAAuB,aADf,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEpD,KAAK,UAAU;KACb,MAAM,OAAgC;MAAE,UAAU,KAAK;MAAW,MAAM,KAAK;MAAO;AAEpF,UAAK,MAAM,OADY;MAAC;MAAQ;MAAQ;MAAS;MAAkB,CAEjE,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,iBAAiB,KAAK;AACxC,YAAO,UAAU,KAAK,SAAS;;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,OAAO,KAAc,yBAAyB;MACjE,SAAS,KAAK;MACd,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAE9E,KAAK,uBAIH,QAAO,eAHQ,MAAM,OAAO,IAAa,sCAAsC,EAC7E,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC,GAC6B,cAAc;IAE/C,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,OAAO,KAAc,yBAAyB;MACjE,QAAQ,KAAK;MACb,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qBAAqB,KAAK,OAAO,kBAAkB,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;;;EAIjG,CAAC;;;;;AClGJ,MAAMC,YAAU;CAAC;CAAU;CAAO;CAAQ;CAAU;CAAU;CAAY;AAE1E,SAAgB,yBAAyB,QAAiB;AACxD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GACnC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SAMH,QAAO,4BAA4B,kBALvB,MAAM,OAAO,KAAyB,sBAAsB;KACtE,MAAM,KAAK;KACX,WAAW,KAAK;KAChB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CACuD;IAE3D,KAAK,MAEH,QAAO,4BAA4B,kBADvB,MAAM,OAAO,IAAwB,mBAAmB,EAAE,eAAe,KAAK,eAAgB,CAAC,CAClD;IAE3D,KAAK,OAIH,QAAO,sBAHM,MAAM,OAAO,IAA0B,2BAA2B,EAC7E,WAAW,KAAK,WACjB,CAAC,CACgC;IAEpC,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB;MACtC,eAAe,KAAK;MACpB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACpC,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,aAAa;MACxE,CAAC;AACF,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB,EAAE,eAAe,KAAK,eAAgB,CAAC;AAC/E,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,yBAAyB;MACzC,eAAe,KAAK;MACpB,MAAM,KAAK;MACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,8BAA8B,KAAK,KAAK;;;EAItD,CAAC;;;;;AC3DJ,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,4BAA4B,QAAiB;AAC3D,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,aAAa;GAC7D,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,aAAa;GACxD,gBAAgB,EAAE,QAAQ,CAAC,UAAU;GACrC,WAAW,EAAE,SAAS,CAAC,UAAU;GACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,cAAc;KACjB,MAAM,OAAO,MAAM,OAAO,KAAkB,eAAe;MACzD,eAAe,KAAK;MACpB,eAAe,KAAK;MACpB,YAAY,KAAK;MACjB,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MAChD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,yBAAyB,KAAK,cAAc,MAAM,KAAK,WAAW,QAAQ,KAAK,OAAO;;IAE/F,KAAK;AACH,WAAM,OAAO,KAAK,eAAe,EAAE,QAAQ,KAAK,QAAS,CAAC;AAC1D,YAAO,gBAAgB,KAAK,OAAO;IAErC,KAAK,cAAc;KACjB,MAAM,WAAW,MAAM,OAAO,KAAsB,mBAAmB;MACrE,eAAe,KAAK;MACpB,UAAU,KAAK;MACf,UAAU,KAAK;MAChB,CAAC;AACF,YAAO,sCAAsC,KAAK,cAAc,QAAQ,SAAS,WAAW;;IAE9F,KAAK;AACH,WAAM,OAAO,KAAK,mBAAmB,EAAE,YAAY,KAAK,YAAa,CAAC;AACtE,YAAO,wBAAwB,KAAK,WAAW;IAEjD,KAAK,aAAa;KAChB,MAAM,QAAQ,MAAM,OAAO,IAA0B,mBAAmB;AACxE,SAAI,MAAM,WAAW,EAAG,QAAO;KAC/B,MAAM,QAAQ,MAAM,KACjB,MAAM,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,kBAAkB,EAAE,aAAa,QACjF;AACD,YAAO,mBAAmB,MAAM,OAAO,OAAO,MAAM,KAAK,KAAK;;IAEhE,KAAK,WAAW;KACd,MAAM,OAAO,MAAM,OAAO,IAAwB,oBAAoB,EACpE,eAAe,KAAK,eACrB,CAAC;AACF,YAAO,kBAAkB,KAAK,KAAK,YAAY,KAAK,cAAc,kBAAkB,KAAK,aAAa;;IAExG,KAAK,cAAc;KACjB,MAAM,OAAgC;MACpC,MAAM,KAAK;MACX,iBAAiB,KAAK;MACtB,YAAY,KAAK;MACjB,gBAAgB,KAAK;MACtB;AACD,SAAI,KAAK,cAAc,OAAW,MAAK,YAAY,KAAK;AACxD,SAAI,KAAK,SAAU,MAAK,WAAW,KAAK;KACxC,MAAM,OAAO,MAAM,OAAO,KAAyB,uBAAuB,KAAK;AAC/E,YAAO,gBAAgB,KAAK,KAAK,iBAAiB,KAAK,cAAc;;IAEvE,KAAK;AACH,WAAM,OAAO,KAAK,uBAAuB,EAAE,eAAe,KAAK,eAAgB,CAAC;AAChF,YAAO,eAAe,KAAK,cAAc;;;EAIhD,CAAC;;;;;AChGJ,MAAMC,YAAU;CAAC;CAAQ;CAAO;CAAU;CAAU;CAAU;CAAY;AAE1E,SAAgB,qBAAqB,QAAiB;AACpD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,iBAAiB,EAAE,SAAS,CAAC,UAAU;GACvC,wBAAwB,EAAE,SAAS,CAAC,UAAU;GAC/C,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,OAEH,QAAO,kBADU,MAAM,OAAO,IAAsB,cAAc,CAChC;IAEpC,KAAK,MAEH,QAAO,wBAAwB,cADf,MAAM,OAAO,IAAoB,eAAe,EAAE,WAAW,KAAK,WAAY,CAAC,CAC1C;IAEvD,KAAK,SAKH,QAAO,wBAAwB,cAJf,MAAM,OAAO,KAAqB,kBAAkB;KAClE,MAAM,KAAK;KACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CACmD;IAEvD,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB;MAClC,WAAW,KAAK;MAChB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACpC,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,aAAa;MACxE,CAAC;AACF,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB,EAAE,WAAW,KAAK,WAAY,CAAC;AACnE,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,qBAAqB;MACrC,qBAAqB,KAAK;MAC1B,MAAM,KAAK;MACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MACzD,GAAI,KAAK,oBAAoB,UAAa,EAAE,iBAAiB,KAAK,iBAAiB;MACnF,GAAI,KAAK,2BAA2B,UAAa,EAAE,wBAAwB,KAAK,wBAAwB;MACzG,CAAC;AACF,YAAO,8BAA8B,KAAK,KAAK;;;EAItD,CAAC;;;;;AC3DJ,MAAMC,YAAU;CAAC;CAAQ;CAAO;CAAU;CAAU;CAAU;CAAS;CAAY;CAAa;AAEhG,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,KAAK,EAAE,QAAQ,CAAC,UAAU;GAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,YAAY,EAAE,QAAQ,CAAC,UAAU;GAClC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,OAEH,QAAO,iBADS,MAAM,OAAO,IAAqB,aAAa,CAC/B;IAElC,KAAK,MAEH,QAAO,uBAAuB,aADlB,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEjD,KAAK,SAUH,QAAO,uBAAuB,aATlB,MAAM,OAAO,KAAoB,iBAAiB;KAC5D,MAAM,KAAK;KACX,WAAW,KAAK;KAChB,MAAM,KAAK;KACX,UAAU,KAAK;KACf,UAAU,KAAK;KACf,YAAY,KAAK;KACjB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CAC6C;IAEjD,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB;MACjC,UAAU,KAAK;MACf,MAAM,KAAK;MACX,WAAW,KAAK;MAChB,MAAM,KAAK;MACX,UAAU,KAAK;MACf,UAAU,KAAK;MACf,YAAY,KAAK;MACjB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,QAEH,QAAO,kBADO,MAAM,OAAO,IAAY,eAAe;IAGxD,KAAK,WAEH,QAAO,cADI,MAAM,OAAO,IAAY,kBAAkB;IAGxD,KAAK,cAAc;KACjB,MAAM,UAAU,MAAM,OAAO,IAAa,2BAA2B;MACnE,KAAK,KAAK;MACV,OAAO,KAAK;MACZ,GAAI,KAAK,cAAc,EAAE,YAAY,KAAK,YAAY;MACvD,CAAC;AACF,YAAO,mCAAmC,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;;;;EAIlF,CAAC;;;;;AClFJ,MAAM,UAAU;CAAC;CAAU;CAAW;CAAM;CAAS;CAAS;AAE9D,SAAgB,sBAAsB,QAAiB;AACrD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAK,QAAQ;GACvB,WAAW,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU;GAC/C,cAAc,EAAE,KAAK,CAAC,UAAU,UAAU,CAAC,CAAC,UAAU;GACtD,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,SAAS,MAAM,OAAO,IAAa,kBAAkB;AAC3D,YAAO,2BAA2B,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAEpE,KAAK,UAEH,QAAO,oBADS,MAAM,OAAO,IAAY,6BAA6B;IAGxE,KAAK,KAEH,QAAO,cADI,MAAM,OAAO,IAAY,iBAAiB;IAGvD,KAAK,SAAS;KACZ,MAAM,OAAO,KAAK,aAAa;KAC/B,MAAM,WAAW,SAAS,QAAQ,sBAAsB;AACxD,WAAM,OAAO,KAAK,UAAU,EAC1B,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC;AACF,YAAO,YAAY,KAAK;;IAE1B,KAAK,UAAU;KACb,MAAM,SAAS,KAAK,gBAAgB;AACpC,SAAI,WAAW,SACb,OAAM,OAAO,KAAK,wBAAwB;SAE1C,OAAM,OAAO,KAAK,0BAA0B,EAC1C,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC;AAEJ,YAAO,GAAG,OAAO;;;;EAIxB,CAAC;;;;;ACpCJ,OAAO,QAAQ;AAGf,MAAM;AAEN,SAAS,qBAAqB;CAC5B,MAAM,UAAU,QAAQ,IAAI;CAC5B,MAAM,SAAS,QAAQ,IAAI;AAE3B,KAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,uDAAuD;AACrE,UAAQ,MAAM,kFAAkF;AAChG,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ;AACX,UAAQ,MAAM,2DAA2D;AACzE,UAAQ,MAAM,6DAA6D;AAC3E,UAAQ,KAAK,EAAE;;AAGjB,yBAAwB,SAAS,OAAO;AACxC,SAAQ,MAAM,0CAA0C,UAAU;;AAGpE,MAAM,SAAS,IAAI,QAAQ;CACzB,MAAM;CACN,SAAS;CACT,cAAc;;;;;;;;;;;;;;;CAef,CAAC;AAEF,qBAAqB,OAAO;AAC5B,yBAAyB,OAAO;AAChC,qBAAqB,OAAO;AAC5B,wBAAwB,OAAO;AAC/B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,oBAAoB,OAAO;AAC3B,yBAAyB,OAAO;AAChC,4BAA4B,OAAO;AAEnC,eAAe,OAAO;AACpB,KAAI;AACF,sBAAoB;EAEpB,MAAM,UAAU,QAAQ,IAAI,mBAAmB,gBAAgB,QAAQ,IAAI,mBAAmB;EAC9F,MAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,OAAO;EACjD,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,MAAI,SAAS;AACX,WAAQ,MAAM,mCAAmC,KAAK,GAAG,OAAO;AAChE,SAAM,OAAO,MAAM;IACjB,eAAe;IACf,YAAY;KACV;KACA;KACA,UAAU;KACX;IACF,CAAC;AACF,WAAQ,MAAM,uCAAuC,KAAK,GAAG,KAAK,MAAM;SACnE;AACL,WAAQ,MAAM,iCAAiC;AAC/C,SAAM,OAAO,MAAM,EACjB,eAAe,SAChB,CAAC;;UAEG,OAAO;AACd,UAAQ,MAAM,mCAAmC,MAAM;AACvD,UAAQ,KAAK,EAAE;;;AAInB,QAAQ,GAAG,gBAAgB;AACzB,SAAQ,MAAM,iDAAiD;AAC/D,SAAQ,KAAK,EAAE;EACf;AAEF,QAAQ,GAAG,iBAAiB;AAC1B,SAAQ,MAAM,iDAAiD;AAC/D,SAAQ,KAAK,EAAE;EACf;AAEF,MAAM,CAAC,MAAM,QAAQ,MAAM"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS","ACTIONS"],"sources":["../src/client/dokploy-client.ts","../src/types.ts","../src/utils/formatters.ts","../src/tools/application-tools.ts","../src/tools/backup-tools.ts","../src/tools/compose-tools.ts","../src/tools/database-tools.ts","../src/tools/deployment-tools.ts","../src/tools/docker-tools.ts","../src/tools/domain-tools.ts","../src/tools/environment-tools.ts","../src/tools/infrastructure-tools.ts","../src/tools/project-tools.ts","../src/tools/server-tools.ts","../src/tools/settings-tools.ts","../src/index.ts"],"sourcesContent":["type RequestOptions = {\n method: \"GET\" | \"POST\"\n params?: Record<string, string | number | boolean | undefined>\n body?: Record<string, unknown>\n}\n\nexport class DokployClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\")\n this.apiKey = apiKey\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n return this.request<T>(path, { method: \"GET\", params })\n }\n\n async post<T>(path: string, body?: Record<string, unknown>): Promise<T> {\n return this.request<T>(path, { method: \"POST\", body })\n }\n\n private async request<T>(path: string, options: RequestOptions): Promise<T> {\n const url = new URL(`/api/${path}`, this.baseUrl)\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"x-api-key\": this.apiKey,\n Accept: \"application/json\",\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n }\n\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\"\n init.body = JSON.stringify(options.body)\n }\n\n const response = await fetch(url.toString(), init)\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\")\n throw new Error(\n `Dokploy API error (${response.status} ${response.statusText}) on ${options.method} /${path}: ${errorText}`,\n )\n }\n\n const text = await response.text()\n if (!text) {\n return undefined as T\n }\n\n return JSON.parse(text) as T\n }\n}\n\nlet client: DokployClient | undefined\n\nexport function initializeDokployClient(baseUrl: string, apiKey: string): DokployClient {\n client = new DokployClient(baseUrl, apiKey)\n return client\n}\n\nexport function getDokployClient(): DokployClient {\n if (!client) {\n throw new Error(\n \"Dokploy client not initialized. Ensure DOKPLOY_URL and DOKPLOY_API_KEY environment variables are set.\",\n )\n }\n return client\n}\n","export const DB_TYPES = [\"postgres\", \"mysql\", \"mariadb\", \"mongo\", \"redis\"] as const\nexport type DatabaseType = (typeof DB_TYPES)[number]\n\nexport const DB_ID_FIELDS: Record<DatabaseType, string> = {\n postgres: \"postgresId\",\n mysql: \"mysqlId\",\n mariadb: \"mariadbId\",\n mongo: \"mongoId\",\n redis: \"redisId\",\n}\n\nexport type DokployProject = {\n projectId: string\n name: string\n description?: string\n createdAt?: string\n organizationId?: string\n environments?: DokployEnvironment[]\n}\n\nexport type DokployEnvironment = {\n environmentId: string\n name: string\n description?: string\n projectId: string\n createdAt?: string\n applications?: DokployApplication[]\n compose?: DokployCompose[]\n postgres?: DokployDatabase[]\n mysql?: DokployDatabase[]\n mariadb?: DokployDatabase[]\n mongo?: DokployDatabase[]\n redis?: DokployDatabase[]\n}\n\nexport type DokployApplication = {\n applicationId: string\n name: string\n appName: string\n description?: string\n applicationStatus: string\n buildType?: string\n sourceType?: string\n dockerImage?: string\n repository?: string\n branch?: string\n environmentId: string\n createdAt?: string\n autoDeploy?: boolean\n env?: string\n domains?: DokployDomain[]\n}\n\nexport type DokployCompose = {\n composeId: string\n name: string\n appName: string\n description?: string\n composeFile?: string\n composeType?: string\n composeStatus: string\n sourceType?: string\n environmentId: string\n createdAt?: string\n}\n\nexport type DokployDeployment = {\n deploymentId: string\n title?: string\n description?: string\n status: string\n logPath?: string\n applicationId?: string\n composeId?: string\n serverId?: string\n createdAt?: string\n}\n\nexport type DokployDomain = {\n domainId: string\n host: string\n path?: string\n port?: number\n https: boolean\n certificateType?: string\n applicationId?: string\n composeId?: string\n serviceName?: string\n domainType?: string\n createdAt?: string\n}\n\nexport type DokployServer = {\n serverId: string\n name: string\n description?: string\n ipAddress: string\n port: number\n username: string\n sshKeyId: string\n serverType: string\n createdAt?: string\n}\n\nexport type DokployDatabase = {\n databaseId: string\n name: string\n appName: string\n description?: string\n databaseName?: string\n databaseUser?: string\n dockerImage?: string\n applicationStatus: string\n environmentId: string\n externalPort?: number\n createdAt?: string\n}\n\nexport type DokployBackup = {\n backupId: string\n schedule: string\n enabled?: boolean\n prefix: string\n destinationId: string\n database: string\n databaseType: string\n keepLatestCount?: number\n postgresId?: string\n mysqlId?: string\n mariadbId?: string\n mongoId?: string\n}\n\nexport type DokployContainer = {\n containerId: string\n name: string\n image: string\n state: string\n status: string\n ports?: string\n}\n\nexport type DokployMount = {\n mountId: string\n type: string\n hostPath?: string\n volumeName?: string\n mountPath: string\n applicationId?: string\n}\n\nexport type DokployPort = {\n portId: string\n publishedPort: number\n targetPort: number\n protocol?: string\n publishMode?: string\n applicationId?: string\n}\n\nexport type DokployCertificate = {\n certificateId: string\n name: string\n certificateData?: string\n privateKey?: string\n autoRenew?: boolean\n}\n\nexport type DokploySecurity = {\n securityId: string\n username: string\n password: string\n applicationId?: string\n}\n","import type {\n DokployApplication,\n DokployBackup,\n DokployCompose,\n DokployContainer,\n DokployDatabase,\n DokployDeployment,\n DokployDomain,\n DokployEnvironment,\n DokployProject,\n DokployServer,\n} from \"../types\"\nimport { DB_TYPES } from \"../types\"\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return \"N/A\"\n try {\n return new Date(dateStr)\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d+Z$/, \" UTC\")\n } catch {\n return dateStr\n }\n}\n\nfunction statusIcon(status: string): string {\n const s = status.toLowerCase()\n if (s === \"running\" || s === \"done\" || s === \"idle\") return \"[RUNNING]\"\n if (s === \"error\" || s === \"failed\") return \"[ERROR]\"\n if (s === \"stopped\") return \"[STOPPED]\"\n return `[${status.toUpperCase()}]`\n}\n\nfunction formatEnvironmentServices(env: DokployEnvironment): string {\n const lines: string[] = []\n\n if (env.applications?.length) {\n for (const app of env.applications) {\n lines.push(` - App: **${app.name}** ${statusIcon(app.applicationStatus)} (ID: ${app.applicationId})`)\n }\n }\n if (env.compose?.length) {\n for (const c of env.compose) {\n lines.push(` - Compose: **${c.name}** ${statusIcon(c.composeStatus)} (ID: ${c.composeId})`)\n }\n }\n for (const dbType of DB_TYPES) {\n const dbs = env[dbType]\n if (dbs?.length) {\n for (const db of dbs) {\n lines.push(` - ${dbType}: **${db.name}** ${statusIcon(db.applicationStatus)} (ID: ${db.databaseId})`)\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nexport function formatProject(project: DokployProject): string {\n const envs = project.environments ?? []\n const envLines = envs.map((env) => {\n const services = formatEnvironmentServices(env)\n const header = ` - **${env.name}** (ID: ${env.environmentId})`\n return services ? `${header}\\n${services}` : header\n })\n\n return `- **${project.name}** (ID: ${project.projectId})\n Description: ${project.description || \"None\"}\n Environments: ${envs.length}${envLines.length ? \"\\n\" + envLines.join(\"\\n\") : \"\"}\n Created: ${formatDate(project.createdAt)}`\n}\n\nexport function formatProjectList(projects: DokployProject[]): string {\n if (projects.length === 0) return \"No projects found.\"\n return `# Projects (${projects.length})\\n\\n${projects.map(formatProject).join(\"\\n\\n\")}`\n}\n\nexport function formatEnvironment(env: DokployEnvironment): string {\n const services = formatEnvironmentServices(env)\n return `- **${env.name}** (ID: ${env.environmentId})\n Description: ${env.description || \"None\"}\n Project: ${env.projectId}\n Created: ${formatDate(env.createdAt)}${services ? \"\\n\" + services : \"\"}`\n}\n\nexport function formatEnvironmentList(envs: DokployEnvironment[]): string {\n if (envs.length === 0) return \"No environments found.\"\n return `# Environments (${envs.length})\\n\\n${envs.map(formatEnvironment).join(\"\\n\\n\")}`\n}\n\nexport function formatApplication(app: DokployApplication): string {\n return `- **${app.name}** ${statusIcon(app.applicationStatus)} (ID: ${app.applicationId})\n App Name: ${app.appName}\n Description: ${app.description || \"None\"}\n Build Type: ${app.buildType || \"N/A\"}\n Source: ${app.sourceType || \"N/A\"}\n Auto Deploy: ${app.autoDeploy ?? \"N/A\"}\n Created: ${formatDate(app.createdAt)}`\n}\n\nexport function formatDeployment(dep: DokployDeployment): string {\n return `- ${statusIcon(dep.status)} **${dep.title || \"Deployment\"}** (ID: ${dep.deploymentId})\n Status: ${dep.status}\n Description: ${dep.description || \"None\"}\n Created: ${formatDate(dep.createdAt)}`\n}\n\nexport function formatDeploymentList(deployments: DokployDeployment[]): string {\n if (deployments.length === 0) return \"No deployments found.\"\n return `# Deployments (${deployments.length})\\n\\n${deployments.map(formatDeployment).join(\"\\n\\n\")}`\n}\n\nexport function formatCompose(compose: DokployCompose): string {\n return `- **${compose.name}** ${statusIcon(compose.composeStatus)} (ID: ${compose.composeId})\n App Name: ${compose.appName}\n Description: ${compose.description || \"None\"}\n Type: ${compose.composeType || \"N/A\"}\n Source: ${compose.sourceType || \"N/A\"}\n Created: ${formatDate(compose.createdAt)}`\n}\n\nexport function formatDomain(domain: DokployDomain): string {\n const protocol = domain.https ? \"https\" : \"http\"\n return `- **${protocol}://${domain.host}${domain.path || \"\"}** (ID: ${domain.domainId})\n Port: ${domain.port ?? \"default\"}\n HTTPS: ${domain.https}\n Certificate: ${domain.certificateType || \"None\"}\n Type: ${domain.domainType || \"N/A\"}\n Service: ${domain.serviceName || \"N/A\"}`\n}\n\nexport function formatDomainList(domains: DokployDomain[]): string {\n if (domains.length === 0) return \"No domains found.\"\n return `# Domains (${domains.length})\\n\\n${domains.map(formatDomain).join(\"\\n\\n\")}`\n}\n\nexport function formatServer(server: DokployServer): string {\n return `- **${server.name}** (ID: ${server.serverId})\n Description: ${server.description || \"None\"}\n IP: ${server.ipAddress}:${server.port}\n User: ${server.username}\n Type: ${server.serverType}\n Created: ${formatDate(server.createdAt)}`\n}\n\nexport function formatServerList(servers: DokployServer[]): string {\n if (servers.length === 0) return \"No servers found.\"\n return `# Servers (${servers.length})\\n\\n${servers.map(formatServer).join(\"\\n\\n\")}`\n}\n\nexport function formatDatabase(db: DokployDatabase, dbType: string): string {\n return `- **${db.name}** ${statusIcon(db.applicationStatus)} (ID: ${db.databaseId})\n Type: ${dbType}\n App Name: ${db.appName}\n Description: ${db.description || \"None\"}\n Database Name: ${db.databaseName || \"N/A\"}\n Image: ${db.dockerImage || \"default\"}\n External Port: ${db.externalPort ?? \"None\"}\n Created: ${formatDate(db.createdAt)}`\n}\n\nexport function formatContainer(container: DokployContainer): string {\n return `- **${container.name}** [${container.state?.toUpperCase() || \"UNKNOWN\"}]\n ID: ${container.containerId}\n Image: ${container.image}\n Status: ${container.status}\n Ports: ${container.ports || \"None\"}`\n}\n\nexport function formatContainerList(containers: DokployContainer[]): string {\n if (containers.length === 0) return \"No containers found.\"\n return `# Containers (${containers.length})\\n\\n${containers.map(formatContainer).join(\"\\n\\n\")}`\n}\n\nexport function formatBackup(backup: DokployBackup): string {\n return `- **${backup.prefix}** (ID: ${backup.backupId})\n Schedule: ${backup.schedule}\n Enabled: ${backup.enabled ?? true}\n Database: ${backup.database}\n Type: ${backup.databaseType}\n Destination: ${backup.destinationId}\n Keep Latest: ${backup.keepLatestCount ?? \"unlimited\"}`\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployApplication } from \"../types\"\nimport { formatApplication } from \"../utils/formatters\"\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"move\",\n \"deploy\",\n \"start\",\n \"stop\",\n \"delete\",\n \"markRunning\",\n \"refreshToken\",\n \"cleanQueues\",\n \"killBuild\",\n \"cancelDeployment\",\n \"reload\",\n \"saveEnvironment\",\n \"saveBuildType\",\n \"traefikConfig\",\n \"readMonitoring\",\n] as const\n\nconst SIMPLE_ACTIONS = [\n \"start\",\n \"stop\",\n \"delete\",\n \"markRunning\",\n \"refreshToken\",\n \"cleanQueues\",\n \"killBuild\",\n \"cancelDeployment\",\n] as const\ntype SimpleAction = (typeof SIMPLE_ACTIONS)[number]\n\nexport function registerApplicationTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_application\",\n description:\n \"Manage applications. create: name+environmentId. get: applicationId. update: applicationId+fields. move: applicationId+targetEnvironmentId. deploy: applicationId, redeploy?. start/stop/delete/markRunning/refreshToken/cleanQueues/killBuild/cancelDeployment: applicationId. reload: applicationId+appName. saveEnvironment: applicationId+env. saveBuildType: applicationId+buildType. traefikConfig: applicationId, traefikConfig? (omit to read). readMonitoring: appName.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n applicationId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n description: z.string().optional(),\n serverId: z.string().optional(),\n targetEnvironmentId: z.string().optional(),\n redeploy: z.boolean().optional(),\n title: z.string().optional(),\n deployDescription: z.string().optional().describe(\"Deploy description (maps to API description field)\"),\n dockerImage: z.string().optional(),\n command: z.string().optional(),\n memoryLimit: z.number().optional(),\n cpuLimit: z.number().optional(),\n replicas: z.number().optional(),\n autoDeploy: z.boolean().optional(),\n appName: z.string().optional(),\n env: z.string().optional().describe(\"KEY=VALUE pairs, newline separated\"),\n buildArgs: z.string().optional(),\n createEnvFile: z.boolean().optional(),\n buildType: z.string().optional(),\n dockerfile: z.string().optional(),\n dockerContextPath: z.string().optional(),\n dockerBuildStage: z.string().optional(),\n publishDirectory: z.string().optional(),\n traefikConfig: z.string().optional().describe(\"New config content (omit to read current)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const app = await client.post<DokployApplication>(\"application.create\", {\n name: args.name!,\n environmentId: args.environmentId!,\n ...(args.description && { description: args.description }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Application Created\\n\\n${formatApplication(app)}`\n }\n case \"get\": {\n const app = await client.get<DokployApplication>(\"application.one\", {\n applicationId: args.applicationId!,\n })\n return `# Application Details\\n\\n${formatApplication(app)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { applicationId: args.applicationId! }\n const updateFields = [\n \"name\",\n \"description\",\n \"dockerImage\",\n \"command\",\n \"memoryLimit\",\n \"cpuLimit\",\n \"replicas\",\n \"autoDeploy\",\n ] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"application.update\", body)\n return `Application ${args.applicationId} updated.`\n }\n case \"move\": {\n await client.post(\"application.move\", {\n applicationId: args.applicationId!,\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Application ${args.applicationId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"deploy\": {\n const endpoint = args.redeploy ? \"application.redeploy\" : \"application.deploy\"\n await client.post(endpoint, {\n applicationId: args.applicationId!,\n ...(args.title && { title: args.title }),\n ...(args.deployDescription && { description: args.deployDescription }),\n })\n return `${args.redeploy ? \"Redeployment\" : \"Deployment\"} triggered for application ${args.applicationId}.`\n }\n case \"start\":\n case \"stop\":\n case \"delete\":\n case \"markRunning\":\n case \"refreshToken\":\n case \"cleanQueues\":\n case \"killBuild\":\n case \"cancelDeployment\": {\n await client.post(`application.${args.action satisfies SimpleAction}`, {\n applicationId: args.applicationId!,\n })\n return `Application ${args.applicationId}: ${args.action} completed.`\n }\n case \"reload\": {\n await client.post(\"application.reload\", {\n applicationId: args.applicationId!,\n appName: args.appName!,\n })\n return `Application ${args.applicationId} reloaded.`\n }\n case \"saveEnvironment\": {\n await client.post(\"application.saveEnvironment\", {\n applicationId: args.applicationId!,\n createEnvFile: args.createEnvFile ?? false,\n ...(args.env !== undefined && { env: args.env }),\n ...(args.buildArgs !== undefined && { buildArgs: args.buildArgs }),\n })\n return `Environment saved for application ${args.applicationId}.`\n }\n case \"saveBuildType\": {\n await client.post(\"application.saveBuildType\", {\n applicationId: args.applicationId!,\n buildType: args.buildType!,\n dockerContextPath: args.dockerContextPath || \".\",\n dockerBuildStage: args.dockerBuildStage || \"\",\n ...(args.dockerfile && { dockerfile: args.dockerfile }),\n ...(args.publishDirectory && { publishDirectory: args.publishDirectory }),\n })\n return `Build type set to \"${args.buildType}\" for application ${args.applicationId}.`\n }\n case \"traefikConfig\": {\n if (args.traefikConfig) {\n await client.post(\"application.updateTraefikConfig\", {\n applicationId: args.applicationId!,\n traefikConfig: args.traefikConfig,\n })\n return `Traefik config updated for application ${args.applicationId}.`\n }\n const config = await client.get<string>(\"application.readTraefikConfig\", {\n applicationId: args.applicationId!,\n })\n return `# Traefik Config\\n\\n\\`\\`\\`yaml\\n${config}\\n\\`\\`\\``\n }\n case \"readMonitoring\": {\n const data = await client.get<unknown>(\"application.readAppMonitoring\", { appName: args.appName! })\n return `# Monitoring: ${args.appName}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployBackup } from \"../types\"\nimport { formatBackup } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"get\", \"update\", \"remove\", \"listFiles\", \"manualBackup\"] as const\n\nexport function registerBackupTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_backup\",\n description:\n \"Manage backups. create: schedule+prefix+destinationId+database+databaseType. get: backupId. update: backupId+fields. remove: backupId. listFiles: destinationId. manualBackup: backupId+backupType.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n backupId: z.string().optional(),\n schedule: z.string().optional().describe(\"Cron expression\"),\n prefix: z.string().optional(),\n destinationId: z.string().optional(),\n database: z.string().optional(),\n databaseType: z.string().optional().describe(\"postgres, mysql, mariadb, or mongo\"),\n serviceName: z.string().optional(),\n enabled: z.boolean().optional(),\n keepLatestCount: z.number().optional(),\n postgresId: z.string().optional(),\n mysqlId: z.string().optional(),\n mariadbId: z.string().optional(),\n mongoId: z.string().optional(),\n composeId: z.string().optional(),\n backupType: z.enum([\"postgres\", \"mysql\", \"mariadb\", \"mongo\", \"compose\"]).optional(),\n search: z.string().optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = {}\n const fields = [\n \"schedule\",\n \"prefix\",\n \"destinationId\",\n \"database\",\n \"databaseType\",\n \"enabled\",\n \"keepLatestCount\",\n \"postgresId\",\n \"mysqlId\",\n \"mariadbId\",\n \"mongoId\",\n \"composeId\",\n \"serviceName\",\n ] as const\n for (const key of fields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const backup = await client.post<DokployBackup>(\"backup.create\", body)\n return `# Backup Created\\n\\n${formatBackup(backup)}`\n }\n case \"get\": {\n const backup = await client.get<DokployBackup>(\"backup.one\", { backupId: args.backupId! })\n return `# Backup Details\\n\\n${formatBackup(backup)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = {}\n const fields = [\n \"backupId\",\n \"schedule\",\n \"prefix\",\n \"destinationId\",\n \"database\",\n \"serviceName\",\n \"databaseType\",\n \"enabled\",\n \"keepLatestCount\",\n ] as const\n for (const key of fields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"backup.update\", body)\n return `Backup ${args.backupId} updated.`\n }\n case \"remove\": {\n await client.post(\"backup.remove\", { backupId: args.backupId! })\n return `Backup ${args.backupId} removed.`\n }\n case \"listFiles\": {\n const files = await client.get<unknown>(\"backup.listBackupFiles\", {\n destinationId: args.destinationId!,\n ...(args.search && { search: args.search }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Backup Files\\n\\n\\`\\`\\`json\\n${JSON.stringify(files, null, 2)}\\n\\`\\`\\``\n }\n case \"manualBackup\": {\n const endpointMap: Record<string, string> = {\n postgres: \"backup.manualBackupPostgres\",\n mysql: \"backup.manualBackupMySql\",\n mariadb: \"backup.manualBackupMariadb\",\n mongo: \"backup.manualBackupMongo\",\n compose: \"backup.manualBackupCompose\",\n }\n const endpoint = endpointMap[args.backupType!]\n await client.post(endpoint, { backupId: args.backupId! })\n return `Manual ${args.backupType} backup triggered for backup config ${args.backupId}.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployCompose } from \"../types\"\nimport { formatCompose } from \"../utils/formatters\"\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"delete\",\n \"deploy\",\n \"start\",\n \"stop\",\n \"move\",\n \"loadServices\",\n \"loadMounts\",\n \"getDefaultCommand\",\n \"cancelDeployment\",\n \"cleanQueues\",\n \"killBuild\",\n \"refreshToken\",\n] as const\n\nexport function registerComposeTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_compose\",\n description:\n \"Manage Docker Compose services. create: name+environmentId. get/delete/start/stop/getDefaultCommand: composeId. update: composeId+fields. deploy: composeId, redeploy?. move: composeId+targetEnvironmentId. loadServices: composeId. loadMounts: composeId+serviceName. cancelDeployment/cleanQueues/killBuild/refreshToken: composeId.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n composeId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n description: z.string().optional(),\n composeType: z.string().optional().describe(\"docker-compose or stack\"),\n composeFile: z.string().optional(),\n serverId: z.string().optional(),\n env: z.string().optional(),\n command: z.string().optional(),\n deleteVolumes: z.boolean().optional(),\n redeploy: z.boolean().optional(),\n title: z.string().optional(),\n deployDescription: z.string().optional(),\n targetEnvironmentId: z.string().optional(),\n type: z.string().optional(),\n serviceName: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const compose = await client.post<DokployCompose>(\"compose.create\", {\n name: args.name!,\n environmentId: args.environmentId!,\n ...(args.description && { description: args.description }),\n ...(args.composeType && { composeType: args.composeType }),\n ...(args.composeFile && { composeFile: args.composeFile }),\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Compose Created\\n\\n${formatCompose(compose)}`\n }\n case \"get\": {\n const compose = await client.get<DokployCompose>(\"compose.one\", { composeId: args.composeId! })\n return `# Compose Details\\n\\n${formatCompose(compose)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { composeId: args.composeId! }\n const updateFields = [\"name\", \"description\", \"composeFile\", \"env\", \"command\"] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"compose.update\", body)\n return `Compose ${args.composeId} updated.`\n }\n case \"delete\": {\n await client.post(\"compose.delete\", {\n composeId: args.composeId!,\n deleteVolumes: args.deleteVolumes ?? false,\n })\n return `Compose ${args.composeId} deleted.`\n }\n case \"deploy\": {\n const endpoint = args.redeploy ? \"compose.redeploy\" : \"compose.deploy\"\n await client.post(endpoint, {\n composeId: args.composeId!,\n ...(args.title && { title: args.title }),\n ...(args.deployDescription && { description: args.deployDescription }),\n })\n return `${args.redeploy ? \"Redeployment\" : \"Deployment\"} triggered for compose ${args.composeId}.`\n }\n case \"start\":\n case \"stop\": {\n await client.post(`compose.${args.action}`, { composeId: args.composeId! })\n return `Compose ${args.composeId}: ${args.action} completed.`\n }\n case \"move\": {\n await client.post(\"compose.move\", {\n composeId: args.composeId!,\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Compose ${args.composeId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"loadServices\": {\n const services = await client.get<unknown>(\"compose.loadServices\", {\n composeId: args.composeId!,\n ...(args.type && { type: args.type }),\n })\n return `# Compose Services\\n\\n\\`\\`\\`json\\n${JSON.stringify(services, null, 2)}\\n\\`\\`\\``\n }\n case \"loadMounts\": {\n const mounts = await client.get<unknown>(\"compose.loadMountsByService\", {\n composeId: args.composeId!,\n serviceName: args.serviceName!,\n })\n return `# Mounts: ${args.serviceName}\\n\\n\\`\\`\\`json\\n${JSON.stringify(mounts, null, 2)}\\n\\`\\`\\``\n }\n case \"getDefaultCommand\": {\n const command = await client.get<string>(\"compose.getDefaultCommand\", { composeId: args.composeId! })\n return `Default command: ${command}`\n }\n case \"cancelDeployment\":\n case \"cleanQueues\":\n case \"killBuild\":\n case \"refreshToken\": {\n await client.post(`compose.${args.action}`, { composeId: args.composeId! })\n return `Compose ${args.composeId}: ${args.action} completed.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DatabaseType, DokployDatabase } from \"../types\"\nimport { DB_ID_FIELDS, DB_TYPES } from \"../types\"\nimport { formatDatabase } from \"../utils/formatters\"\n\nconst dbTypeSchema = z.enum(DB_TYPES).describe(\"postgres, mysql, mariadb, mongo, or redis\")\n\nfunction dbIdField(dbType: DatabaseType): string {\n return DB_ID_FIELDS[dbType]\n}\n\nfunction dbBody(dbType: DatabaseType, databaseId: string): Record<string, unknown> {\n return { [dbIdField(dbType)]: databaseId }\n}\n\nconst ACTIONS = [\n \"create\",\n \"get\",\n \"update\",\n \"move\",\n \"start\",\n \"stop\",\n \"deploy\",\n \"rebuild\",\n \"remove\",\n \"reload\",\n \"changeStatus\",\n \"saveEnvironment\",\n \"saveExternalPort\",\n] as const\n\nconst SIMPLE_ACTIONS = [\"start\", \"stop\", \"deploy\", \"rebuild\", \"remove\"] as const\ntype SimpleAction = (typeof SIMPLE_ACTIONS)[number]\n\nexport function registerDatabaseTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_database\",\n description:\n \"Manage databases (postgres/mysql/mariadb/mongo/redis). create: dbType+name+environmentId+databasePassword. get: dbType+databaseId. update: dbType+databaseId+fields. move: dbType+databaseId+targetEnvironmentId. start/stop/deploy/rebuild/remove: dbType+databaseId. reload: dbType+databaseId+appName. changeStatus: dbType+databaseId+applicationStatus. saveEnvironment: dbType+databaseId+env. saveExternalPort: dbType+databaseId+externalPort.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n dbType: dbTypeSchema,\n databaseId: z.string().optional(),\n name: z.string().optional(),\n environmentId: z.string().optional(),\n databaseName: z.string().optional(),\n databaseUser: z.string().optional(),\n databasePassword: z.string().optional(),\n databaseRootPassword: z.string().optional().describe(\"mysql/mariadb only\"),\n dockerImage: z.string().optional(),\n description: z.string().optional(),\n serverId: z.string().optional(),\n command: z.string().optional(),\n memoryLimit: z.number().optional(),\n cpuLimit: z.number().optional(),\n targetEnvironmentId: z.string().optional(),\n appName: z.string().optional(),\n applicationStatus: z.string().optional().describe(\"idle, running, done, or error\"),\n env: z.string().optional().describe(\"KEY=VALUE, newline separated\"),\n externalPort: z.number().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n const { dbType } = args\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = {}\n const createFields = [\n \"name\",\n \"environmentId\",\n \"databaseName\",\n \"databaseUser\",\n \"databasePassword\",\n \"databaseRootPassword\",\n \"dockerImage\",\n \"description\",\n \"serverId\",\n ] as const\n for (const key of createFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const db = await client.post<DokployDatabase>(`${dbType}.create`, body)\n return `# Database Created\\n\\n${formatDatabase(db, dbType)}`\n }\n case \"get\": {\n const db = await client.get<DokployDatabase>(`${dbType}.one`, {\n [dbIdField(dbType)]: args.databaseId!,\n })\n return `# Database Details\\n\\n${formatDatabase(db, dbType)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { [dbIdField(dbType)]: args.databaseId! }\n const updateFields = [\"name\", \"description\", \"dockerImage\", \"command\", \"memoryLimit\", \"cpuLimit\"] as const\n for (const key of updateFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(`${dbType}.update`, body)\n return `Database ${args.databaseId} (${dbType}) updated.`\n }\n case \"move\": {\n await client.post(`${dbType}.move`, {\n ...dbBody(dbType, args.databaseId!),\n targetEnvironmentId: args.targetEnvironmentId!,\n })\n return `Database ${args.databaseId} moved to environment ${args.targetEnvironmentId}.`\n }\n case \"start\":\n case \"stop\":\n case \"deploy\":\n case \"rebuild\":\n case \"remove\": {\n await client.post(`${dbType}.${args.action satisfies SimpleAction}`, dbBody(dbType, args.databaseId!))\n return `Database ${args.databaseId} (${dbType}): ${args.action} completed.`\n }\n case \"reload\": {\n await client.post(`${dbType}.reload`, {\n ...dbBody(dbType, args.databaseId!),\n appName: args.appName!,\n })\n return `Database ${args.databaseId} (${dbType}) reloaded.`\n }\n case \"changeStatus\": {\n await client.post(`${dbType}.changeStatus`, {\n ...dbBody(dbType, args.databaseId!),\n applicationStatus: args.applicationStatus!,\n })\n return `Database ${args.databaseId} status changed to ${args.applicationStatus}.`\n }\n case \"saveEnvironment\": {\n await client.post(`${dbType}.saveEnvironment`, {\n ...dbBody(dbType, args.databaseId!),\n ...(args.env !== undefined && { env: args.env }),\n })\n return `Environment saved for database ${args.databaseId}.`\n }\n case \"saveExternalPort\": {\n await client.post(`${dbType}.saveExternalPort`, {\n ...dbBody(dbType, args.databaseId!),\n externalPort: args.externalPort!,\n })\n return `External port set to ${args.externalPort} for database ${args.databaseId}.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployDeployment } from \"../types\"\nimport { formatDeploymentList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"killProcess\"] as const\n\nexport function registerDeploymentTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_deployment\",\n description:\n \"Manage deployments. list: applicationId|composeId|serverId|type+id. killProcess: deploymentId. Note: no log retrieval API exists; deployment data includes logPath for reference only.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n deploymentId: z.string().optional(),\n applicationId: z.string().optional(),\n composeId: z.string().optional(),\n serverId: z.string().optional(),\n type: z.string().optional().describe(\"Resource type (application, compose, postgres, mysql, etc.)\"),\n id: z.string().optional().describe(\"Resource ID (used with type)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n let deployments: DokployDeployment[]\n\n if (args.applicationId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.all\", {\n applicationId: args.applicationId,\n })\n } else if (args.composeId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByCompose\", {\n composeId: args.composeId,\n })\n } else if (args.serverId) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByServer\", {\n serverId: args.serverId,\n })\n } else if (args.type && args.id) {\n deployments = await client.get<DokployDeployment[]>(\"deployment.allByType\", {\n type: args.type,\n id: args.id,\n })\n } else {\n throw new Error(\"Provide applicationId, composeId, serverId, or type+id\")\n }\n\n return formatDeploymentList(deployments)\n }\n case \"killProcess\": {\n await client.post(\"deployment.killProcess\", { deploymentId: args.deploymentId! })\n return `Deployment ${args.deploymentId} killed.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployContainer } from \"../types\"\nimport { formatContainerList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"getContainers\", \"restartContainer\", \"getConfig\", \"findContainers\"] as const\n\nexport function registerDockerTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_docker\",\n description:\n \"Docker container management. getContainers: list all containers, serverId?. restartContainer: containerId. getConfig: containerId (required, not appName), serverId?. findContainers: appName+method(match|label|stack|service), serverId?.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n containerId: z.string().optional(),\n serverId: z.string().optional(),\n appName: z.string().optional(),\n method: z.enum([\"match\", \"label\", \"stack\", \"service\"]).optional(),\n appType: z.string().optional().describe(\"App type filter (match method only)\"),\n type: z.string().optional().describe(\"Label type (label method only)\"),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"getContainers\": {\n const containers = await client.get<DokployContainer[]>(\"docker.getContainers\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return formatContainerList(containers)\n }\n case \"restartContainer\": {\n await client.post(\"docker.restartContainer\", { containerId: args.containerId! })\n return `Container ${args.containerId} restarted.`\n }\n case \"getConfig\": {\n const config = await client.get<unknown>(\"docker.getConfig\", {\n containerId: args.containerId!,\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Container Config\\n\\n\\`\\`\\`json\\n${JSON.stringify(config, null, 2)}\\n\\`\\`\\``\n }\n case \"findContainers\": {\n if (!args.method) throw new Error(\"findContainers requires method (match|label|stack|service)\")\n const endpointMap: Record<string, string> = {\n match: \"docker.getContainersByAppNameMatch\",\n label: \"docker.getContainersByAppLabel\",\n stack: \"docker.getStackContainersByAppName\",\n service: \"docker.getServiceContainersByAppName\",\n }\n const method = args.method!\n const params: Record<string, string> = { appName: args.appName! }\n if (args.serverId) params.serverId = args.serverId\n if (args.appType && method === \"match\") params.appType = args.appType\n if (args.type && method === \"label\") params.type = args.type\n const containers = await client.get<DokployContainer[]>(endpointMap[method], params)\n return formatContainerList(containers)\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployDomain } from \"../types\"\nimport { formatDomain, formatDomainList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"list\", \"get\", \"update\", \"delete\", \"generate\", \"canGenerateTraefikMe\", \"validate\"] as const\n\nexport function registerDomainTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_domain\",\n description:\n \"Manage domains. create: host+applicationId|composeId. list: applicationId|composeId. get: domainId. update: domainId+host. delete: domainId. generate: appName. canGenerateTraefikMe: serverId?. validate: domain.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n domainId: z.string().optional(),\n host: z.string().optional(),\n applicationId: z.string().optional(),\n composeId: z.string().optional(),\n serviceName: z.string().optional(),\n path: z.string().optional(),\n port: z.number().optional(),\n https: z.boolean().optional(),\n certificateType: z.string().optional(),\n domainType: z.string().optional(),\n appName: z.string().optional(),\n serverId: z.string().optional(),\n domain: z.string().optional(),\n serverIp: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const body: Record<string, unknown> = { host: args.host! }\n const optionalFields = [\n \"applicationId\",\n \"composeId\",\n \"serviceName\",\n \"path\",\n \"port\",\n \"https\",\n \"certificateType\",\n \"domainType\",\n ] as const\n for (const key of optionalFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n const domain = await client.post<DokployDomain>(\"domain.create\", body)\n return `# Domain Created\\n\\n${formatDomain(domain)}`\n }\n case \"list\": {\n let domains: DokployDomain[]\n if (args.applicationId) {\n domains = await client.get<DokployDomain[]>(\"domain.byApplicationId\", {\n applicationId: args.applicationId,\n })\n } else if (args.composeId) {\n domains = await client.get<DokployDomain[]>(\"domain.byComposeId\", { composeId: args.composeId })\n } else {\n throw new Error(\"Provide applicationId or composeId\")\n }\n return formatDomainList(domains)\n }\n case \"get\": {\n const domain = await client.get<DokployDomain>(\"domain.one\", { domainId: args.domainId! })\n return `# Domain Details\\n\\n${formatDomain(domain)}`\n }\n case \"update\": {\n const body: Record<string, unknown> = { domainId: args.domainId!, host: args.host! }\n const optionalFields = [\"path\", \"port\", \"https\", \"certificateType\"] as const\n for (const key of optionalFields) {\n if (args[key] !== undefined) body[key] = args[key]\n }\n await client.post(\"domain.update\", body)\n return `Domain ${args.domainId} updated.`\n }\n case \"delete\": {\n await client.post(\"domain.delete\", { domainId: args.domainId! })\n return `Domain ${args.domainId} deleted.`\n }\n case \"generate\": {\n const result = await client.post<unknown>(\"domain.generateDomain\", {\n appName: args.appName!,\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `# Generated Domain\\n\\n\\`\\`\\`json\\n${JSON.stringify(result, null, 2)}\\n\\`\\`\\``\n }\n case \"canGenerateTraefikMe\": {\n const result = await client.get<boolean>(\"domain.canGenerateTraefikMeDomains\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `Traefik.me: ${result ? \"Available\" : \"Not available\"}`\n }\n case \"validate\": {\n const result = await client.post<unknown>(\"domain.validateDomain\", {\n domain: args.domain!,\n ...(args.serverIp && { serverIp: args.serverIp }),\n })\n return `# DNS Validation: ${args.domain}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployEnvironment } from \"../types\"\nimport { formatEnvironment, formatEnvironmentList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"create\", \"get\", \"list\", \"update\", \"remove\", \"duplicate\"] as const\n\nexport function registerEnvironmentTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_environment\",\n description:\n \"Manage project environments. create: projectId+name. get: environmentId. list: projectId. update: environmentId+fields. remove: environmentId. duplicate: environmentId+name.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n environmentId: z.string().optional(),\n projectId: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"create\": {\n const env = await client.post<DokployEnvironment>(\"environment.create\", {\n name: args.name!,\n projectId: args.projectId!,\n ...(args.description && { description: args.description }),\n })\n return `# Environment Created\\n\\n${formatEnvironment(env)}`\n }\n case \"get\": {\n const env = await client.get<DokployEnvironment>(\"environment.one\", { environmentId: args.environmentId! })\n return `# Environment Details\\n\\n${formatEnvironment(env)}`\n }\n case \"list\": {\n const envs = await client.get<DokployEnvironment[]>(\"environment.byProjectId\", {\n projectId: args.projectId!,\n })\n return formatEnvironmentList(envs)\n }\n case \"update\": {\n await client.post(\"environment.update\", {\n environmentId: args.environmentId!,\n ...(args.name && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n })\n return `Environment ${args.environmentId} updated.`\n }\n case \"remove\": {\n await client.post(\"environment.remove\", { environmentId: args.environmentId! })\n return `Environment ${args.environmentId} removed.`\n }\n case \"duplicate\": {\n await client.post(\"environment.duplicate\", {\n environmentId: args.environmentId!,\n name: args.name!,\n ...(args.description && { description: args.description }),\n })\n return `Environment duplicated as \"${args.name}\".`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployCertificate, DokployPort, DokploySecurity } from \"../types\"\n\nconst ACTIONS = [\n \"createPort\",\n \"deletePort\",\n \"createAuth\",\n \"deleteAuth\",\n \"listCerts\",\n \"getCert\",\n \"createCert\",\n \"removeCert\",\n] as const\n\nexport function registerInfrastructureTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_infrastructure\",\n description:\n \"Manage ports, auth, certs. createPort: applicationId+publishedPort+targetPort. deletePort: portId. createAuth: applicationId+username+password. deleteAuth: securityId. listCerts: all. getCert: certificateId. createCert: name+certificateData+privateKey+organizationId. removeCert: certificateId.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n applicationId: z.string().optional(),\n publishedPort: z.number().optional(),\n targetPort: z.number().optional(),\n protocol: z.string().optional(),\n publishMode: z.string().optional(),\n portId: z.string().optional(),\n username: z.string().optional(),\n password: z.string().optional(),\n securityId: z.string().optional(),\n certificateId: z.string().optional(),\n name: z.string().optional(),\n certificateData: z.string().optional().describe(\"PEM format\"),\n privateKey: z.string().optional().describe(\"PEM format\"),\n organizationId: z.string().optional(),\n autoRenew: z.boolean().optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"createPort\": {\n const port = await client.post<DokployPort>(\"port.create\", {\n applicationId: args.applicationId!,\n publishedPort: args.publishedPort!,\n targetPort: args.targetPort!,\n ...(args.protocol && { protocol: args.protocol }),\n ...(args.publishMode && { publishMode: args.publishMode }),\n })\n return `Port mapping created: ${port.publishedPort} -> ${port.targetPort} (ID: ${port.portId})`\n }\n case \"deletePort\": {\n await client.post(\"port.delete\", { portId: args.portId! })\n return `Port mapping ${args.portId} deleted.`\n }\n case \"createAuth\": {\n const security = await client.post<DokploySecurity>(\"security.create\", {\n applicationId: args.applicationId!,\n username: args.username!,\n password: args.password!,\n })\n return `Basic auth created for application ${args.applicationId} (ID: ${security.securityId})`\n }\n case \"deleteAuth\": {\n await client.post(\"security.delete\", { securityId: args.securityId! })\n return `Security credentials ${args.securityId} deleted.`\n }\n case \"listCerts\": {\n const certs = await client.get<DokployCertificate[]>(\"certificates.all\")\n if (certs.length === 0) return \"No certificates found.\"\n const lines = certs.map(\n (c) => `- **${c.name}** (ID: ${c.certificateId}) | Auto-renew: ${c.autoRenew ?? \"N/A\"}`,\n )\n return `# Certificates (${certs.length})\\n\\n${lines.join(\"\\n\")}`\n }\n case \"getCert\": {\n const cert = await client.get<DokployCertificate>(\"certificates.one\", {\n certificateId: args.certificateId!,\n })\n return `# Certificate: ${cert.name}\\n\\n- ID: ${cert.certificateId}\\n- Auto-renew: ${cert.autoRenew ?? \"N/A\"}`\n }\n case \"createCert\": {\n const body: Record<string, unknown> = {\n name: args.name!,\n certificateData: args.certificateData!,\n privateKey: args.privateKey!,\n organizationId: args.organizationId!,\n }\n if (args.autoRenew !== undefined) body.autoRenew = args.autoRenew\n if (args.serverId) body.serverId = args.serverId\n const cert = await client.post<DokployCertificate>(\"certificates.create\", body)\n return `Certificate \"${cert.name}\" created (ID: ${cert.certificateId}).`\n }\n case \"removeCert\": {\n await client.post(\"certificates.remove\", { certificateId: args.certificateId! })\n return `Certificate ${args.certificateId} removed.`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployProject } from \"../types\"\nimport { formatProject, formatProjectList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"get\", \"create\", \"update\", \"remove\", \"duplicate\"] as const\n\nexport function registerProjectTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_project\",\n description:\n \"Manage projects. list: all (includes nested environments with applications, composes, databases). get: projectId (same nested detail). create: name. update: projectId+fields. remove: projectId. duplicate: sourceEnvironmentId+name.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n projectId: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n sourceEnvironmentId: z.string().optional(),\n duplicateInSameProject: z.boolean().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n const projects = await client.get<DokployProject[]>(\"project.all\")\n return formatProjectList(projects)\n }\n case \"get\": {\n const project = await client.get<DokployProject>(\"project.one\", { projectId: args.projectId! })\n return `# Project Details\\n\\n${formatProject(project)}`\n }\n case \"create\": {\n const project = await client.post<DokployProject>(\"project.create\", {\n name: args.name!,\n ...(args.description && { description: args.description }),\n })\n return `# Project Created\\n\\n${formatProject(project)}`\n }\n case \"update\": {\n await client.post(\"project.update\", {\n projectId: args.projectId!,\n ...(args.name && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n })\n return `Project ${args.projectId} updated.`\n }\n case \"remove\": {\n await client.post(\"project.remove\", { projectId: args.projectId! })\n return `Project ${args.projectId} removed.`\n }\n case \"duplicate\": {\n await client.post(\"project.duplicate\", {\n sourceEnvironmentId: args.sourceEnvironmentId!,\n name: args.name!,\n ...(args.description && { description: args.description }),\n ...(args.duplicateInSameProject !== undefined && { duplicateInSameProject: args.duplicateInSameProject }),\n })\n return `Environment duplicated as \"${args.name}\".`\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\nimport type { DokployServer } from \"../types\"\nimport { formatServer, formatServerList } from \"../utils/formatters\"\n\nconst ACTIONS = [\"list\", \"get\", \"create\", \"update\", \"remove\", \"count\", \"publicIp\", \"getMetrics\"] as const\n\nexport function registerServerTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_server\",\n description:\n \"Manage servers. list/count/publicIp: no params. get: serverId. create: name+ipAddress+port+username+sshKeyId+serverType. update: serverId+fields. remove: serverId. getMetrics: url+token.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n serverId: z.string().optional(),\n name: z.string().optional(),\n ipAddress: z.string().optional(),\n port: z.number().optional(),\n username: z.string().optional(),\n sshKeyId: z.string().optional(),\n serverType: z.string().optional(),\n description: z.string().optional(),\n url: z.string().optional(),\n token: z.string().optional(),\n dataPoints: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"list\": {\n const servers = await client.get<DokployServer[]>(\"server.all\")\n return formatServerList(servers)\n }\n case \"get\": {\n const srv = await client.get<DokployServer>(\"server.one\", { serverId: args.serverId! })\n return `# Server Details\\n\\n${formatServer(srv)}`\n }\n case \"create\": {\n const srv = await client.post<DokployServer>(\"server.create\", {\n name: args.name!,\n ipAddress: args.ipAddress!,\n port: args.port!,\n username: args.username!,\n sshKeyId: args.sshKeyId!,\n serverType: args.serverType!,\n ...(args.description && { description: args.description }),\n })\n return `# Server Created\\n\\n${formatServer(srv)}`\n }\n case \"update\": {\n await client.post(\"server.update\", {\n serverId: args.serverId!,\n name: args.name!,\n ipAddress: args.ipAddress!,\n port: args.port!,\n username: args.username!,\n sshKeyId: args.sshKeyId!,\n serverType: args.serverType!,\n ...(args.description && { description: args.description }),\n })\n return `Server ${args.serverId} updated.`\n }\n case \"remove\": {\n await client.post(\"server.remove\", { serverId: args.serverId! })\n return `Server ${args.serverId} removed.`\n }\n case \"count\": {\n const count = await client.get<number>(\"server.count\")\n return `Total servers: ${count}`\n }\n case \"publicIp\": {\n const ip = await client.get<string>(\"server.publicIp\")\n return `Public IP: ${ip}`\n }\n case \"getMetrics\": {\n const metrics = await client.get<unknown>(\"server.getServerMetrics\", {\n url: args.url!,\n token: args.token!,\n ...(args.dataPoints && { dataPoints: args.dataPoints }),\n })\n return `# Server Metrics\\n\\n\\`\\`\\`json\\n${JSON.stringify(metrics, null, 2)}\\n\\`\\`\\``\n }\n }\n },\n })\n}\n","import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { getDokployClient } from \"../client/dokploy-client\"\n\nconst ACTIONS = [\"health\", \"version\", \"ip\", \"clean\", \"reload\"] as const\n\nexport function registerSettingsTools(server: FastMCP) {\n server.addTool({\n name: \"dokploy_settings\",\n description:\n \"System settings. health: check status. version: get version. ip: get IP. clean: cleanType (all|images), serverId?. reload: reloadTarget (server|traefik), serverId?.\",\n parameters: z.object({\n action: z.enum(ACTIONS),\n cleanType: z.enum([\"all\", \"images\"]).optional(),\n reloadTarget: z.enum([\"server\", \"traefik\"]).optional(),\n serverId: z.string().optional(),\n }),\n execute: async (args) => {\n const client = getDokployClient()\n\n switch (args.action) {\n case \"health\": {\n const health = await client.get<unknown>(\"settings.health\")\n return `# Health\\n\\n\\`\\`\\`json\\n${JSON.stringify(health, null, 2)}\\n\\`\\`\\``\n }\n case \"version\": {\n const version = await client.get<string>(\"settings.getDokployVersion\")\n return `Dokploy version: ${version}`\n }\n case \"ip\": {\n const ip = await client.get<string>(\"settings.getIp\")\n return `Server IP: ${ip}`\n }\n case \"clean\": {\n const type = args.cleanType ?? \"all\"\n const endpoint = type === \"all\" ? \"settings.cleanAll\" : \"settings.cleanUnusedImages\"\n await client.post(endpoint, {\n ...(args.serverId && { serverId: args.serverId }),\n })\n return `Cleanup (${type}) completed.`\n }\n case \"reload\": {\n const target = args.reloadTarget ?? \"server\"\n if (target === \"server\") {\n await client.post(\"settings.reloadServer\")\n } else {\n await client.post(\"settings.reloadTraefik\", {\n ...(args.serverId && { serverId: args.serverId }),\n })\n }\n return `${target} reloaded.`\n }\n }\n },\n })\n}\n","import dotenv from \"dotenv\"\nimport { FastMCP } from \"fastmcp\"\n\nimport { initializeDokployClient } from \"./client/dokploy-client\"\nimport {\n registerApplicationTools,\n registerBackupTools,\n registerComposeTools,\n registerDatabaseTools,\n registerDeploymentTools,\n registerDockerTools,\n registerDomainTools,\n registerEnvironmentTools,\n registerInfrastructureTools,\n registerProjectTools,\n registerServerTools,\n registerSettingsTools,\n} from \"./tools\"\n\ndotenv.config()\n\ndeclare const __VERSION__: string\nconst VERSION = (typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"0.0.0-dev\") as `${number}.${number}.${number}`\n\nfunction setupDokployClient() {\n const baseUrl = process.env.DOKPLOY_URL\n const apiKey = process.env.DOKPLOY_API_KEY\n\n if (!baseUrl) {\n console.error(\"[Error] DOKPLOY_URL environment variable is required\")\n console.error(\"[Error] Set it to your Dokploy instance URL (e.g., https://dokploy.example.com)\")\n process.exit(1)\n }\n\n if (!apiKey) {\n console.error(\"[Error] DOKPLOY_API_KEY environment variable is required\")\n console.error(\"[Error] Generate an API key in Dokploy Settings > API Keys\")\n process.exit(1)\n }\n\n initializeDokployClient(baseUrl, apiKey)\n console.error(`[Setup] Dokploy client initialized for ${baseUrl}`)\n}\n\nconst server = new FastMCP({\n name: \"dokploy-mcp-server\",\n version: VERSION,\n instructions: `A comprehensive Dokploy MCP server for managing deployments, applications, databases, domains, and infrastructure.\n\nAvailable capabilities:\n- Projects: list, create, update, remove, duplicate\n- Applications: create, deploy, redeploy, start, stop, delete, configure builds, manage environment variables\n- Docker Compose: create, deploy, start, stop, manage services\n- Databases: unified tools for postgres, mysql, mariadb, mongo, redis (create, deploy, start, stop, manage)\n- Domains: create, configure, validate DNS, generate traefik.me domains\n- Docker: list containers, restart, inspect configuration\n- Servers: add, configure, monitor remote servers\n- Deployments: list, track, kill deployment processes\n- Backups: schedule, trigger manual backups, list backup files\n- Environments: create, duplicate, manage project environments\n- Infrastructure: ports, certificates, basic auth security\n- Settings: health checks, version info, cleanup, reload services`,\n})\n\nregisterProjectTools(server)\nregisterApplicationTools(server)\nregisterComposeTools(server)\nregisterDeploymentTools(server)\nregisterDockerTools(server)\nregisterDomainTools(server)\nregisterServerTools(server)\nregisterSettingsTools(server)\nregisterDatabaseTools(server)\nregisterBackupTools(server)\nregisterEnvironmentTools(server)\nregisterInfrastructureTools(server)\n\nasync function main() {\n try {\n setupDokployClient()\n\n const useHttp = process.env.TRANSPORT_TYPE === \"httpStream\" || process.env.TRANSPORT_TYPE === \"http\"\n const port = parseInt(process.env.PORT || \"3000\")\n const host = process.env.HOST || \"0.0.0.0\"\n\n if (useHttp) {\n console.error(`[Setup] Starting HTTP server on ${host}:${port}`)\n await server.start({\n transportType: \"httpStream\",\n httpStream: {\n port,\n host,\n endpoint: \"/mcp\",\n },\n })\n console.error(`[Setup] HTTP server ready at http://${host}:${port}/mcp`)\n } else {\n console.error(\"[Setup] Starting in stdio mode\")\n await server.start({\n transportType: \"stdio\",\n })\n }\n } catch (error) {\n console.error(\"[Error] Failed to start server:\", error)\n process.exit(1)\n }\n}\n\nprocess.on(\"SIGINT\", () => {\n console.error(\"[Shutdown] Shutting down Dokploy MCP Server...\")\n process.exit(0)\n})\n\nprocess.on(\"SIGTERM\", () => {\n console.error(\"[Shutdown] Shutting down Dokploy MCP Server...\")\n process.exit(0)\n})\n\nmain().catch(console.error)\n"],"mappings":";;;;;AAMA,IAAa,gBAAb,MAA2B;CACzB,AAAQ;CACR,AAAQ;CAER,YAAY,SAAiB,QAAgB;AAC3C,OAAK,UAAU,QAAQ,QAAQ,QAAQ,GAAG;AAC1C,OAAK,SAAS;;CAGhB,MAAM,IAAO,MAAc,QAA4E;AACrG,SAAO,KAAK,QAAW,MAAM;GAAE,QAAQ;GAAO;GAAQ,CAAC;;CAGzD,MAAM,KAAQ,MAAc,MAA4C;AACtE,SAAO,KAAK,QAAW,MAAM;GAAE,QAAQ;GAAQ;GAAM,CAAC;;CAGxD,MAAc,QAAW,MAAc,SAAqC;EAC1E,MAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAEjD,MAAI,QAAQ,QACV;QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,CACvD,KAAI,UAAU,OACZ,KAAI,aAAa,IAAI,KAAK,OAAO,MAAM,CAAC;;EAK9C,MAAM,UAAkC;GACtC,aAAa,KAAK;GAClB,QAAQ;GACT;EAED,MAAM,OAAoB;GACxB,QAAQ,QAAQ;GAChB;GACD;AAED,MAAI,QAAQ,MAAM;AAChB,WAAQ,kBAAkB;AAC1B,QAAK,OAAO,KAAK,UAAU,QAAQ,KAAK;;EAG1C,MAAM,WAAW,MAAM,MAAM,IAAI,UAAU,EAAE,KAAK;AAElD,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;AACpE,SAAM,IAAI,MACR,sBAAsB,SAAS,OAAO,GAAG,SAAS,WAAW,OAAO,QAAQ,OAAO,IAAI,KAAK,IAAI,YACjG;;EAGH,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,MAAI,CAAC,KACH;AAGF,SAAO,KAAK,MAAM,KAAK;;;AAI3B,IAAI;AAEJ,SAAgB,wBAAwB,SAAiB,QAA+B;AACtF,UAAS,IAAI,cAAc,SAAS,OAAO;AAC3C,QAAO;;AAGT,SAAgB,mBAAkC;AAChD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,wGACD;AAEH,QAAO;;;;;AChFT,MAAa,WAAW;CAAC;CAAY;CAAS;CAAW;CAAS;CAAQ;AAG1E,MAAa,eAA6C;CACxD,UAAU;CACV,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACR;;;;ACKD,SAAS,WAAW,SAA0B;AAC5C,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI;AACF,SAAO,IAAI,KAAK,QAAQ,CACrB,aAAa,CACb,QAAQ,KAAK,IAAI,CACjB,QAAQ,WAAW,OAAO;SACvB;AACN,SAAO;;;AAIX,SAAS,WAAW,QAAwB;CAC1C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,aAAa,MAAM,UAAU,MAAM,OAAQ,QAAO;AAC5D,KAAI,MAAM,WAAW,MAAM,SAAU,QAAO;AAC5C,KAAI,MAAM,UAAW,QAAO;AAC5B,QAAO,IAAI,OAAO,aAAa,CAAC;;AAGlC,SAAS,0BAA0B,KAAiC;;CAClE,MAAM,QAAkB,EAAE;AAE1B,0BAAI,IAAI,oFAAc,OACpB,MAAK,MAAM,OAAO,IAAI,aACpB,OAAM,KAAK,gBAAgB,IAAI,KAAK,KAAK,WAAW,IAAI,kBAAkB,CAAC,QAAQ,IAAI,cAAc,GAAG;AAG5G,qBAAI,IAAI,qEAAS,OACf,MAAK,MAAM,KAAK,IAAI,QAClB,OAAM,KAAK,oBAAoB,EAAE,KAAK,KAAK,WAAW,EAAE,cAAc,CAAC,QAAQ,EAAE,UAAU,GAAG;AAGlG,MAAK,MAAM,UAAU,UAAU;EAC7B,MAAM,MAAM,IAAI;AAChB,gDAAI,IAAK,OACP,MAAK,MAAM,MAAM,IACf,OAAM,KAAK,SAAS,OAAO,MAAM,GAAG,KAAK,KAAK,WAAW,GAAG,kBAAkB,CAAC,QAAQ,GAAG,WAAW,GAAG;;AAK9G,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAgB,cAAc,SAAiC;CAC7D,MAAM,OAAO,QAAQ,gBAAgB,EAAE;CACvC,MAAM,WAAW,KAAK,KAAK,QAAQ;EACjC,MAAM,WAAW,0BAA0B,IAAI;EAC/C,MAAM,SAAS,SAAS,IAAI,KAAK,UAAU,IAAI,cAAc;AAC7D,SAAO,WAAW,GAAG,OAAO,IAAI,aAAa;GAC7C;AAEF,QAAO,OAAO,QAAQ,KAAK,UAAU,QAAQ,UAAU;iBACxC,QAAQ,eAAe,OAAO;kBAC7B,KAAK,SAAS,SAAS,SAAS,OAAO,SAAS,KAAK,KAAK,GAAG,GAAG;aACrE,WAAW,QAAQ,UAAU;;AAG1C,SAAgB,kBAAkB,UAAoC;AACpE,KAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAO,eAAe,SAAS,OAAO,OAAO,SAAS,IAAI,cAAc,CAAC,KAAK,OAAO;;AAGvF,SAAgB,kBAAkB,KAAiC;CACjE,MAAM,WAAW,0BAA0B,IAAI;AAC/C,QAAO,OAAO,IAAI,KAAK,UAAU,IAAI,cAAc;iBACpC,IAAI,eAAe,OAAO;aAC9B,IAAI,UAAU;aACd,WAAW,IAAI,UAAU,GAAG,WAAW,OAAO,WAAW;;AAGtE,SAAgB,sBAAsB,MAAoC;AACxE,KAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAO,mBAAmB,KAAK,OAAO,OAAO,KAAK,IAAI,kBAAkB,CAAC,KAAK,OAAO;;AAGvF,SAAgB,kBAAkB,KAAiC;AACjE,QAAO,OAAO,IAAI,KAAK,KAAK,WAAW,IAAI,kBAAkB,CAAC,QAAQ,IAAI,cAAc;cAC5E,IAAI,QAAQ;iBACT,IAAI,eAAe,OAAO;gBAC3B,IAAI,aAAa,MAAM;YAC3B,IAAI,cAAc,MAAM;iBACnB,IAAI,cAAc,MAAM;aAC5B,WAAW,IAAI,UAAU;;AAGtC,SAAgB,iBAAiB,KAAgC;AAC/D,QAAO,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,aAAa,UAAU,IAAI,aAAa;YACnF,IAAI,OAAO;iBACN,IAAI,eAAe,OAAO;aAC9B,WAAW,IAAI,UAAU;;AAGtC,SAAgB,qBAAqB,aAA0C;AAC7E,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAO,kBAAkB,YAAY,OAAO,OAAO,YAAY,IAAI,iBAAiB,CAAC,KAAK,OAAO;;AAGnG,SAAgB,cAAc,SAAiC;AAC7D,QAAO,OAAO,QAAQ,KAAK,KAAK,WAAW,QAAQ,cAAc,CAAC,QAAQ,QAAQ,UAAU;cAChF,QAAQ,QAAQ;iBACb,QAAQ,eAAe,OAAO;UACrC,QAAQ,eAAe,MAAM;YAC3B,QAAQ,cAAc,MAAM;aAC3B,WAAW,QAAQ,UAAU;;AAG1C,SAAgB,aAAa,QAA+B;AAE1D,QAAO,OADU,OAAO,QAAQ,UAAU,OACnB,KAAK,OAAO,OAAO,OAAO,QAAQ,GAAG,UAAU,OAAO,SAAS;UAC9E,OAAO,QAAQ,UAAU;WACxB,OAAO,MAAM;iBACP,OAAO,mBAAmB,OAAO;UACxC,OAAO,cAAc,MAAM;aACxB,OAAO,eAAe;;AAGnC,SAAgB,iBAAiB,SAAkC;AACjE,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAO,cAAc,QAAQ,OAAO,OAAO,QAAQ,IAAI,aAAa,CAAC,KAAK,OAAO;;AAGnF,SAAgB,aAAa,QAA+B;AAC1D,QAAO,OAAO,OAAO,KAAK,UAAU,OAAO,SAAS;iBACrC,OAAO,eAAe,OAAO;QACtC,OAAO,UAAU,GAAG,OAAO,KAAK;UAC9B,OAAO,SAAS;UAChB,OAAO,WAAW;aACf,WAAW,OAAO,UAAU;;AAGzC,SAAgB,iBAAiB,SAAkC;AACjE,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAO,cAAc,QAAQ,OAAO,OAAO,QAAQ,IAAI,aAAa,CAAC,KAAK,OAAO;;AAGnF,SAAgB,eAAe,IAAqB,QAAwB;AAC1E,QAAO,OAAO,GAAG,KAAK,KAAK,WAAW,GAAG,kBAAkB,CAAC,QAAQ,GAAG,WAAW;UAC1E,OAAO;cACH,GAAG,QAAQ;iBACR,GAAG,eAAe,OAAO;mBACvB,GAAG,gBAAgB,MAAM;WACjC,GAAG,eAAe,UAAU;mBACpB,GAAG,gBAAgB,OAAO;aAChC,WAAW,GAAG,UAAU;;AAGrC,SAAgB,gBAAgB,WAAqC;;AACnE,QAAO,OAAO,UAAU,KAAK,2BAAM,UAAU,2EAAO,aAAa,KAAI,UAAU;QACzE,UAAU,YAAY;WACnB,UAAU,MAAM;YACf,UAAU,OAAO;WAClB,UAAU,SAAS;;AAG9B,SAAgB,oBAAoB,YAAwC;AAC1E,KAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAO,iBAAiB,WAAW,OAAO,OAAO,WAAW,IAAI,gBAAgB,CAAC,KAAK,OAAO;;AAG/F,SAAgB,aAAa,QAA+B;AAC1D,QAAO,OAAO,OAAO,OAAO,UAAU,OAAO,SAAS;cAC1C,OAAO,SAAS;aACjB,OAAO,WAAW,KAAK;cACtB,OAAO,SAAS;UACpB,OAAO,aAAa;iBACb,OAAO,cAAc;iBACrB,OAAO,mBAAmB;;;;;AC/K3C,MAAMA,aAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAcD,SAAgB,yBAAyB,QAAiB;AACxD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,WAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,UAAU,EAAE,SAAS,CAAC,UAAU;GAChC,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qDAAqD;GACvG,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,SAAS,CAAC,UAAU;GAClC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qCAAqC;GACzE,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,eAAe,EAAE,SAAS,CAAC,UAAU;GACrC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;GACxC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,4CAA4C;GAC3F,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SAOH,QAAO,4BAA4B,kBANvB,MAAM,OAAO,KAAyB,sBAAsB;KACtE,MAAM,KAAK;KACX,eAAe,KAAK;KACpB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;KACjD,CAAC,CACuD;IAE3D,KAAK,MAIH,QAAO,4BAA4B,kBAHvB,MAAM,OAAO,IAAwB,mBAAmB,EAClE,eAAe,KAAK,eACrB,CAAC,CACuD;IAE3D,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,eAAe,KAAK,eAAgB;AAW5E,UAAK,MAAM,OAVU;MACnB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,sBAAsB,KAAK;AAC7C,YAAO,eAAe,KAAK,cAAc;;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,oBAAoB;MACpC,eAAe,KAAK;MACpB,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,eAAe,KAAK,cAAc,wBAAwB,KAAK,oBAAoB;IAE5F,KAAK,UAAU;KACb,MAAM,WAAW,KAAK,WAAW,yBAAyB;AAC1D,WAAM,OAAO,KAAK,UAAU;MAC1B,eAAe,KAAK;MACpB,GAAI,KAAK,SAAS,EAAE,OAAO,KAAK,OAAO;MACvC,GAAI,KAAK,qBAAqB,EAAE,aAAa,KAAK,mBAAmB;MACtE,CAAC;AACF,YAAO,GAAG,KAAK,WAAW,iBAAiB,aAAa,6BAA6B,KAAK,cAAc;;IAE1G,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,eAAe,KAAK,UAAiC,EACrE,eAAe,KAAK,eACrB,CAAC;AACF,YAAO,eAAe,KAAK,cAAc,IAAI,KAAK,OAAO;IAE3D,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB;MACtC,eAAe,KAAK;MACpB,SAAS,KAAK;MACf,CAAC;AACF,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,+BAA+B;MAC/C,eAAe,KAAK;MACpB,eAAe,KAAK,iBAAiB;MACrC,GAAI,KAAK,QAAQ,UAAa,EAAE,KAAK,KAAK,KAAK;MAC/C,GAAI,KAAK,cAAc,UAAa,EAAE,WAAW,KAAK,WAAW;MAClE,CAAC;AACF,YAAO,qCAAqC,KAAK,cAAc;IAEjE,KAAK;AACH,WAAM,OAAO,KAAK,6BAA6B;MAC7C,eAAe,KAAK;MACpB,WAAW,KAAK;MAChB,mBAAmB,KAAK,qBAAqB;MAC7C,kBAAkB,KAAK,oBAAoB;MAC3C,GAAI,KAAK,cAAc,EAAE,YAAY,KAAK,YAAY;MACtD,GAAI,KAAK,oBAAoB,EAAE,kBAAkB,KAAK,kBAAkB;MACzE,CAAC;AACF,YAAO,sBAAsB,KAAK,UAAU,oBAAoB,KAAK,cAAc;IAErF,KAAK;AACH,SAAI,KAAK,eAAe;AACtB,YAAM,OAAO,KAAK,mCAAmC;OACnD,eAAe,KAAK;OACpB,eAAe,KAAK;OACrB,CAAC;AACF,aAAO,0CAA0C,KAAK,cAAc;;AAKtE,YAAO,mCAHQ,MAAM,OAAO,IAAY,iCAAiC,EACvE,eAAe,KAAK,eACrB,CAAC,CAC+C;IAEnD,KAAK,kBAAkB;KACrB,MAAM,OAAO,MAAM,OAAO,IAAa,iCAAiC,EAAE,SAAS,KAAK,SAAU,CAAC;AACnG,YAAO,iBAAiB,KAAK,QAAQ,kBAAkB,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;;;;EAI5F,CAAC;;;;;AClLJ,MAAMC,aAAU;CAAC;CAAU;CAAO;CAAU;CAAU;CAAa;CAAe;AAElF,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,WAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,kBAAkB;GAC3D,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qCAAqC;GAClF,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,SAAS,EAAE,SAAS,CAAC,UAAU;GAC/B,iBAAiB,EAAE,QAAQ,CAAC,UAAU;GACtC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,YAAY,EAAE,KAAK;IAAC;IAAY;IAAS;IAAW;IAAS;IAAU,CAAC,CAAC,UAAU;GACnF,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAgBxC,UAAK,MAAM,OAfI;MACb;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,uBAAuB,aADf,MAAM,OAAO,KAAoB,iBAAiB,KAAK,CACpB;;IAEpD,KAAK,MAEH,QAAO,uBAAuB,aADf,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEpD,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAYxC,UAAK,MAAM,OAXI;MACb;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,iBAAiB,KAAK;AACxC,YAAO,UAAU,KAAK,SAAS;;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,aAAa;KAChB,MAAM,QAAQ,MAAM,OAAO,IAAa,0BAA0B;MAChE,eAAe,KAAK;MACpB,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,QAAQ;MAC1C,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,iCAAiC,KAAK,UAAU,OAAO,MAAM,EAAE,CAAC;;IAEzE,KAAK,gBAAgB;KAQnB,MAAM,WAPsC;MAC1C,UAAU;MACV,OAAO;MACP,SAAS;MACT,OAAO;MACP,SAAS;MACV,CAC4B,KAAK;AAClC,WAAM,OAAO,KAAK,UAAU,EAAE,UAAU,KAAK,UAAW,CAAC;AACzD,YAAO,UAAU,KAAK,WAAW,sCAAsC,KAAK,SAAS;;;;EAI5F,CAAC;;;;;ACvGJ,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,qBAAqB,QAAiB;AACpD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,0BAA0B;GACtE,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,KAAK,EAAE,QAAQ,CAAC,UAAU;GAC1B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,eAAe,EAAE,SAAS,CAAC,UAAU;GACrC,UAAU,EAAE,SAAS,CAAC,UAAU;GAChC,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU;GACxC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GACnC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SASH,QAAO,wBAAwB,cARf,MAAM,OAAO,KAAqB,kBAAkB;KAClE,MAAM,KAAK;KACX,eAAe,KAAK;KACpB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KACzD,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;KACjD,CAAC,CACmD;IAEvD,KAAK,MAEH,QAAO,wBAAwB,cADf,MAAM,OAAO,IAAoB,eAAe,EAAE,WAAW,KAAK,WAAY,CAAC,CAC1C;IAEvD,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,WAAW,KAAK,WAAY;AAEpE,UAAK,MAAM,OADU;MAAC;MAAQ;MAAe;MAAe;MAAO;MAAU,CAE3E,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,kBAAkB,KAAK;AACzC,YAAO,WAAW,KAAK,UAAU;;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB;MAClC,WAAW,KAAK;MAChB,eAAe,KAAK,iBAAiB;MACtC,CAAC;AACF,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK,UAAU;KACb,MAAM,WAAW,KAAK,WAAW,qBAAqB;AACtD,WAAM,OAAO,KAAK,UAAU;MAC1B,WAAW,KAAK;MAChB,GAAI,KAAK,SAAS,EAAE,OAAO,KAAK,OAAO;MACvC,GAAI,KAAK,qBAAqB,EAAE,aAAa,KAAK,mBAAmB;MACtE,CAAC;AACF,YAAO,GAAG,KAAK,WAAW,iBAAiB,aAAa,yBAAyB,KAAK,UAAU;;IAElG,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,WAAW,KAAK,UAAU,EAAE,WAAW,KAAK,WAAY,CAAC;AAC3E,YAAO,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO;IAEnD,KAAK;AACH,WAAM,OAAO,KAAK,gBAAgB;MAChC,WAAW,KAAK;MAChB,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,WAAW,KAAK,UAAU,wBAAwB,KAAK,oBAAoB;IAEpF,KAAK,gBAAgB;KACnB,MAAM,WAAW,MAAM,OAAO,IAAa,wBAAwB;MACjE,WAAW,KAAK;MAChB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACrC,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;IAEhF,KAAK,cAAc;KACjB,MAAM,SAAS,MAAM,OAAO,IAAa,+BAA+B;MACtE,WAAW,KAAK;MAChB,aAAa,KAAK;MACnB,CAAC;AACF,YAAO,aAAa,KAAK,YAAY,kBAAkB,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAEzF,KAAK,oBAEH,QAAO,oBADS,MAAM,OAAO,IAAY,6BAA6B,EAAE,WAAW,KAAK,WAAY,CAAC;IAGvG,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,WAAW,KAAK,UAAU,EAAE,WAAW,KAAK,WAAY,CAAC;AAC3E,YAAO,WAAW,KAAK,UAAU,IAAI,KAAK,OAAO;;;EAIxD,CAAC;;;;;AC5HJ,MAAM,eAAe,EAAE,KAAK,SAAS,CAAC,SAAS,4CAA4C;AAE3F,SAAS,UAAU,QAA8B;AAC/C,QAAO,aAAa;;AAGtB,SAAS,OAAO,QAAsB,YAA6C;AACjF,QAAO,GAAG,UAAU,OAAO,GAAG,YAAY;;AAG5C,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAKD,SAAgB,sBAAsB,QAAiB;AACrD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,QAAQ;GACR,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,kBAAkB,EAAE,QAAQ,CAAC,UAAU;GACvC,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,qBAAqB;GAC1E,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,gCAAgC;GAClF,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,+BAA+B;GACnE,cAAc,EAAE,QAAQ,CAAC,UAAU;GACpC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;GACjC,MAAM,EAAE,WAAW;AAEnB,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE;AAYxC,UAAK,MAAM,OAXU;MACnB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,yBAAyB,eADrB,MAAM,OAAO,KAAsB,GAAG,OAAO,UAAU,KAAK,EACpB,OAAO;;IAE5D,KAAK,MAIH,QAAO,yBAAyB,eAHrB,MAAM,OAAO,IAAqB,GAAG,OAAO,OAAO,GAC3D,UAAU,OAAO,GAAG,KAAK,YAC3B,CAAC,EACiD,OAAO;IAE5D,KAAK,UAAU;KACb,MAAM,OAAgC,GAAG,UAAU,OAAO,GAAG,KAAK,YAAa;AAE/E,UAAK,MAAM,OADU;MAAC;MAAQ;MAAe;MAAe;MAAW;MAAe;MAAW,CAE/F,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,GAAG,OAAO,UAAU,KAAK;AAC3C,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO;;IAEhD,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,QAAQ;MAClC,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,qBAAqB,KAAK;MAC3B,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,wBAAwB,KAAK,oBAAoB;IAEtF,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,GAAG,KAAK,UAAiC,OAAO,QAAQ,KAAK,WAAY,CAAC;AACtG,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,OAAO;IAEjE,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,UAAU;MACpC,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,SAAS,KAAK;MACf,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,IAAI,OAAO;IAEhD,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,gBAAgB;MAC1C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,mBAAmB,KAAK;MACzB,CAAC;AACF,YAAO,YAAY,KAAK,WAAW,qBAAqB,KAAK,kBAAkB;IAEjF,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,mBAAmB;MAC7C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,GAAI,KAAK,QAAQ,UAAa,EAAE,KAAK,KAAK,KAAK;MAChD,CAAC;AACF,YAAO,kCAAkC,KAAK,WAAW;IAE3D,KAAK;AACH,WAAM,OAAO,KAAK,GAAG,OAAO,oBAAoB;MAC9C,GAAG,OAAO,QAAQ,KAAK,WAAY;MACnC,cAAc,KAAK;MACpB,CAAC;AACF,YAAO,wBAAwB,KAAK,aAAa,gBAAgB,KAAK,WAAW;;;EAIxF,CAAC;;;;;AC7IJ,MAAMC,YAAU,CAAC,QAAQ,cAAc;AAEvC,SAAgB,wBAAwB,QAAiB;AACvD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,cAAc,EAAE,QAAQ,CAAC,UAAU;GACnC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,8DAA8D;GACnG,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,+BAA+B;GACnE,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,QAAQ;KACX,IAAI;AAEJ,SAAI,KAAK,cACP,eAAc,MAAM,OAAO,IAAyB,kBAAkB,EACpE,eAAe,KAAK,eACrB,CAAC;cACO,KAAK,UACd,eAAc,MAAM,OAAO,IAAyB,2BAA2B,EAC7E,WAAW,KAAK,WACjB,CAAC;cACO,KAAK,SACd,eAAc,MAAM,OAAO,IAAyB,0BAA0B,EAC5E,UAAU,KAAK,UAChB,CAAC;cACO,KAAK,QAAQ,KAAK,GAC3B,eAAc,MAAM,OAAO,IAAyB,wBAAwB;MAC1E,MAAM,KAAK;MACX,IAAI,KAAK;MACV,CAAC;SAEF,OAAM,IAAI,MAAM,yDAAyD;AAG3E,YAAO,qBAAqB,YAAY;;IAE1C,KAAK;AACH,WAAM,OAAO,KAAK,0BAA0B,EAAE,cAAc,KAAK,cAAe,CAAC;AACjF,YAAO,cAAc,KAAK,aAAa;;;EAI9C,CAAC;;;;;ACpDJ,MAAMC,YAAU;CAAC;CAAiB;CAAoB;CAAa;CAAiB;AAEpF,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,QAAQ,EAAE,KAAK;IAAC;IAAS;IAAS;IAAS;IAAU,CAAC,CAAC,UAAU;GACjE,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,sCAAsC;GAC9E,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,iCAAiC;GACvE,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,gBAIH,QAAO,oBAHY,MAAM,OAAO,IAAwB,wBAAwB,EAC9E,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC,CACoC;IAExC,KAAK;AACH,WAAM,OAAO,KAAK,2BAA2B,EAAE,aAAa,KAAK,aAAc,CAAC;AAChF,YAAO,aAAa,KAAK,YAAY;IAEvC,KAAK,aAAa;KAChB,MAAM,SAAS,MAAM,OAAO,IAAa,oBAAoB;MAC3D,aAAa,KAAK;MAClB,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAE9E,KAAK,kBAAkB;AACrB,SAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,6DAA6D;KAC/F,MAAM,cAAsC;MAC1C,OAAO;MACP,OAAO;MACP,OAAO;MACP,SAAS;MACV;KACD,MAAM,SAAS,KAAK;KACpB,MAAM,SAAiC,EAAE,SAAS,KAAK,SAAU;AACjE,SAAI,KAAK,SAAU,QAAO,WAAW,KAAK;AAC1C,SAAI,KAAK,WAAW,WAAW,QAAS,QAAO,UAAU,KAAK;AAC9D,SAAI,KAAK,QAAQ,WAAW,QAAS,QAAO,OAAO,KAAK;AAExD,YAAO,oBADY,MAAM,OAAO,IAAwB,YAAY,SAAS,OAAO,CAC9C;;;;EAI7C,CAAC;;;;;ACvDJ,MAAMC,YAAU;CAAC;CAAU;CAAQ;CAAO;CAAU;CAAU;CAAY;CAAwB;CAAW;AAE7G,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,OAAO,EAAE,SAAS,CAAC,UAAU;GAC7B,iBAAiB,EAAE,QAAQ,CAAC,UAAU;GACtC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;GAC9B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,OAAgC,EAAE,MAAM,KAAK,MAAO;AAW1D,UAAK,MAAM,OAVY;MACrB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD,CAEC,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAGhD,YAAO,uBAAuB,aADf,MAAM,OAAO,KAAoB,iBAAiB,KAAK,CACpB;;IAEpD,KAAK,QAAQ;KACX,IAAI;AACJ,SAAI,KAAK,cACP,WAAU,MAAM,OAAO,IAAqB,0BAA0B,EACpE,eAAe,KAAK,eACrB,CAAC;cACO,KAAK,UACd,WAAU,MAAM,OAAO,IAAqB,sBAAsB,EAAE,WAAW,KAAK,WAAW,CAAC;SAEhG,OAAM,IAAI,MAAM,qCAAqC;AAEvD,YAAO,iBAAiB,QAAQ;;IAElC,KAAK,MAEH,QAAO,uBAAuB,aADf,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEpD,KAAK,UAAU;KACb,MAAM,OAAgC;MAAE,UAAU,KAAK;MAAW,MAAM,KAAK;MAAO;AAEpF,UAAK,MAAM,OADY;MAAC;MAAQ;MAAQ;MAAS;MAAkB,CAEjE,KAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAEhD,WAAM,OAAO,KAAK,iBAAiB,KAAK;AACxC,YAAO,UAAU,KAAK,SAAS;;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,OAAO,KAAc,yBAAyB;MACjE,SAAS,KAAK;MACd,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qCAAqC,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAE9E,KAAK,uBAIH,QAAO,eAHQ,MAAM,OAAO,IAAa,sCAAsC,EAC7E,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC,GAC6B,cAAc;IAE/C,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,OAAO,KAAc,yBAAyB;MACjE,QAAQ,KAAK;MACb,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MACjD,CAAC;AACF,YAAO,qBAAqB,KAAK,OAAO,kBAAkB,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;;;EAIjG,CAAC;;;;;AClGJ,MAAMC,YAAU;CAAC;CAAU;CAAO;CAAQ;CAAU;CAAU;CAAY;AAE1E,SAAgB,yBAAyB,QAAiB;AACxD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GACnC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,SAMH,QAAO,4BAA4B,kBALvB,MAAM,OAAO,KAAyB,sBAAsB;KACtE,MAAM,KAAK;KACX,WAAW,KAAK;KAChB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CACuD;IAE3D,KAAK,MAEH,QAAO,4BAA4B,kBADvB,MAAM,OAAO,IAAwB,mBAAmB,EAAE,eAAe,KAAK,eAAgB,CAAC,CAClD;IAE3D,KAAK,OAIH,QAAO,sBAHM,MAAM,OAAO,IAA0B,2BAA2B,EAC7E,WAAW,KAAK,WACjB,CAAC,CACgC;IAEpC,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB;MACtC,eAAe,KAAK;MACpB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACpC,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,aAAa;MACxE,CAAC;AACF,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,sBAAsB,EAAE,eAAe,KAAK,eAAgB,CAAC;AAC/E,YAAO,eAAe,KAAK,cAAc;IAE3C,KAAK;AACH,WAAM,OAAO,KAAK,yBAAyB;MACzC,eAAe,KAAK;MACpB,MAAM,KAAK;MACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,8BAA8B,KAAK,KAAK;;;EAItD,CAAC;;;;;AC3DJ,MAAMC,YAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,4BAA4B,QAAiB;AAC3D,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,eAAe,EAAE,QAAQ,CAAC,UAAU;GACpC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,aAAa;GAC7D,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,aAAa;GACxD,gBAAgB,EAAE,QAAQ,CAAC,UAAU;GACrC,WAAW,EAAE,SAAS,CAAC,UAAU;GACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,cAAc;KACjB,MAAM,OAAO,MAAM,OAAO,KAAkB,eAAe;MACzD,eAAe,KAAK;MACpB,eAAe,KAAK;MACpB,YAAY,KAAK;MACjB,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU;MAChD,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,yBAAyB,KAAK,cAAc,MAAM,KAAK,WAAW,QAAQ,KAAK,OAAO;;IAE/F,KAAK;AACH,WAAM,OAAO,KAAK,eAAe,EAAE,QAAQ,KAAK,QAAS,CAAC;AAC1D,YAAO,gBAAgB,KAAK,OAAO;IAErC,KAAK,cAAc;KACjB,MAAM,WAAW,MAAM,OAAO,KAAsB,mBAAmB;MACrE,eAAe,KAAK;MACpB,UAAU,KAAK;MACf,UAAU,KAAK;MAChB,CAAC;AACF,YAAO,sCAAsC,KAAK,cAAc,QAAQ,SAAS,WAAW;;IAE9F,KAAK;AACH,WAAM,OAAO,KAAK,mBAAmB,EAAE,YAAY,KAAK,YAAa,CAAC;AACtE,YAAO,wBAAwB,KAAK,WAAW;IAEjD,KAAK,aAAa;KAChB,MAAM,QAAQ,MAAM,OAAO,IAA0B,mBAAmB;AACxE,SAAI,MAAM,WAAW,EAAG,QAAO;KAC/B,MAAM,QAAQ,MAAM,KACjB,MAAM,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,kBAAkB,EAAE,aAAa,QACjF;AACD,YAAO,mBAAmB,MAAM,OAAO,OAAO,MAAM,KAAK,KAAK;;IAEhE,KAAK,WAAW;KACd,MAAM,OAAO,MAAM,OAAO,IAAwB,oBAAoB,EACpE,eAAe,KAAK,eACrB,CAAC;AACF,YAAO,kBAAkB,KAAK,KAAK,YAAY,KAAK,cAAc,kBAAkB,KAAK,aAAa;;IAExG,KAAK,cAAc;KACjB,MAAM,OAAgC;MACpC,MAAM,KAAK;MACX,iBAAiB,KAAK;MACtB,YAAY,KAAK;MACjB,gBAAgB,KAAK;MACtB;AACD,SAAI,KAAK,cAAc,OAAW,MAAK,YAAY,KAAK;AACxD,SAAI,KAAK,SAAU,MAAK,WAAW,KAAK;KACxC,MAAM,OAAO,MAAM,OAAO,KAAyB,uBAAuB,KAAK;AAC/E,YAAO,gBAAgB,KAAK,KAAK,iBAAiB,KAAK,cAAc;;IAEvE,KAAK;AACH,WAAM,OAAO,KAAK,uBAAuB,EAAE,eAAe,KAAK,eAAgB,CAAC;AAChF,YAAO,eAAe,KAAK,cAAc;;;EAIhD,CAAC;;;;;AChGJ,MAAMC,YAAU;CAAC;CAAQ;CAAO;CAAU;CAAU;CAAU;CAAY;AAE1E,SAAgB,qBAAqB,QAAiB;AACpD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;GAC1C,wBAAwB,EAAE,SAAS,CAAC,UAAU;GAC/C,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,OAEH,QAAO,kBADU,MAAM,OAAO,IAAsB,cAAc,CAChC;IAEpC,KAAK,MAEH,QAAO,wBAAwB,cADf,MAAM,OAAO,IAAoB,eAAe,EAAE,WAAW,KAAK,WAAY,CAAC,CAC1C;IAEvD,KAAK,SAKH,QAAO,wBAAwB,cAJf,MAAM,OAAO,KAAqB,kBAAkB;KAClE,MAAM,KAAK;KACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CACmD;IAEvD,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB;MAClC,WAAW,KAAK;MAChB,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM;MACpC,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,aAAa;MACxE,CAAC;AACF,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,kBAAkB,EAAE,WAAW,KAAK,WAAY,CAAC;AACnE,YAAO,WAAW,KAAK,UAAU;IAEnC,KAAK;AACH,WAAM,OAAO,KAAK,qBAAqB;MACrC,qBAAqB,KAAK;MAC1B,MAAM,KAAK;MACX,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MACzD,GAAI,KAAK,2BAA2B,UAAa,EAAE,wBAAwB,KAAK,wBAAwB;MACzG,CAAC;AACF,YAAO,8BAA8B,KAAK,KAAK;;;EAItD,CAAC;;;;;ACzDJ,MAAMC,YAAU;CAAC;CAAQ;CAAO;CAAU;CAAU;CAAU;CAAS;CAAY;CAAa;AAEhG,SAAgB,oBAAoB,QAAiB;AACnD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAKA,UAAQ;GACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;GAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;GACjC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,KAAK,EAAE,QAAQ,CAAC,UAAU;GAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU;GAC5B,YAAY,EAAE,QAAQ,CAAC,UAAU;GAClC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,OAEH,QAAO,iBADS,MAAM,OAAO,IAAqB,aAAa,CAC/B;IAElC,KAAK,MAEH,QAAO,uBAAuB,aADlB,MAAM,OAAO,IAAmB,cAAc,EAAE,UAAU,KAAK,UAAW,CAAC,CACxC;IAEjD,KAAK,SAUH,QAAO,uBAAuB,aATlB,MAAM,OAAO,KAAoB,iBAAiB;KAC5D,MAAM,KAAK;KACX,WAAW,KAAK;KAChB,MAAM,KAAK;KACX,UAAU,KAAK;KACf,UAAU,KAAK;KACf,YAAY,KAAK;KACjB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;KAC1D,CAAC,CAC6C;IAEjD,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB;MACjC,UAAU,KAAK;MACf,MAAM,KAAK;MACX,WAAW,KAAK;MAChB,MAAM,KAAK;MACX,UAAU,KAAK;MACf,UAAU,KAAK;MACf,YAAY,KAAK;MACjB,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,aAAa;MAC1D,CAAC;AACF,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK;AACH,WAAM,OAAO,KAAK,iBAAiB,EAAE,UAAU,KAAK,UAAW,CAAC;AAChE,YAAO,UAAU,KAAK,SAAS;IAEjC,KAAK,QAEH,QAAO,kBADO,MAAM,OAAO,IAAY,eAAe;IAGxD,KAAK,WAEH,QAAO,cADI,MAAM,OAAO,IAAY,kBAAkB;IAGxD,KAAK,cAAc;KACjB,MAAM,UAAU,MAAM,OAAO,IAAa,2BAA2B;MACnE,KAAK,KAAK;MACV,OAAO,KAAK;MACZ,GAAI,KAAK,cAAc,EAAE,YAAY,KAAK,YAAY;MACvD,CAAC;AACF,YAAO,mCAAmC,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;;;;EAIlF,CAAC;;;;;AClFJ,MAAM,UAAU;CAAC;CAAU;CAAW;CAAM;CAAS;CAAS;AAE9D,SAAgB,sBAAsB,QAAiB;AACrD,QAAO,QAAQ;EACb,MAAM;EACN,aACE;EACF,YAAY,EAAE,OAAO;GACnB,QAAQ,EAAE,KAAK,QAAQ;GACvB,WAAW,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU;GAC/C,cAAc,EAAE,KAAK,CAAC,UAAU,UAAU,CAAC,CAAC,UAAU;GACtD,UAAU,EAAE,QAAQ,CAAC,UAAU;GAChC,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,SAAS,kBAAkB;AAEjC,WAAQ,KAAK,QAAb;IACE,KAAK,UAAU;KACb,MAAM,SAAS,MAAM,OAAO,IAAa,kBAAkB;AAC3D,YAAO,2BAA2B,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;IAEpE,KAAK,UAEH,QAAO,oBADS,MAAM,OAAO,IAAY,6BAA6B;IAGxE,KAAK,KAEH,QAAO,cADI,MAAM,OAAO,IAAY,iBAAiB;IAGvD,KAAK,SAAS;KACZ,MAAM,OAAO,KAAK,aAAa;KAC/B,MAAM,WAAW,SAAS,QAAQ,sBAAsB;AACxD,WAAM,OAAO,KAAK,UAAU,EAC1B,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC;AACF,YAAO,YAAY,KAAK;;IAE1B,KAAK,UAAU;KACb,MAAM,SAAS,KAAK,gBAAgB;AACpC,SAAI,WAAW,SACb,OAAM,OAAO,KAAK,wBAAwB;SAE1C,OAAM,OAAO,KAAK,0BAA0B,EAC1C,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,UAAU,EACjD,CAAC;AAEJ,YAAO,GAAG,OAAO;;;;EAIxB,CAAC;;;;;ACpCJ,OAAO,QAAQ;AAGf,MAAM;AAEN,SAAS,qBAAqB;CAC5B,MAAM,UAAU,QAAQ,IAAI;CAC5B,MAAM,SAAS,QAAQ,IAAI;AAE3B,KAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,uDAAuD;AACrE,UAAQ,MAAM,kFAAkF;AAChG,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ;AACX,UAAQ,MAAM,2DAA2D;AACzE,UAAQ,MAAM,6DAA6D;AAC3E,UAAQ,KAAK,EAAE;;AAGjB,yBAAwB,SAAS,OAAO;AACxC,SAAQ,MAAM,0CAA0C,UAAU;;AAGpE,MAAM,SAAS,IAAI,QAAQ;CACzB,MAAM;CACN,SAAS;CACT,cAAc;;;;;;;;;;;;;;;CAef,CAAC;AAEF,qBAAqB,OAAO;AAC5B,yBAAyB,OAAO;AAChC,qBAAqB,OAAO;AAC5B,wBAAwB,OAAO;AAC/B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,oBAAoB,OAAO;AAC3B,yBAAyB,OAAO;AAChC,4BAA4B,OAAO;AAEnC,eAAe,OAAO;AACpB,KAAI;AACF,sBAAoB;EAEpB,MAAM,UAAU,QAAQ,IAAI,mBAAmB,gBAAgB,QAAQ,IAAI,mBAAmB;EAC9F,MAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,OAAO;EACjD,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,MAAI,SAAS;AACX,WAAQ,MAAM,mCAAmC,KAAK,GAAG,OAAO;AAChE,SAAM,OAAO,MAAM;IACjB,eAAe;IACf,YAAY;KACV;KACA;KACA,UAAU;KACX;IACF,CAAC;AACF,WAAQ,MAAM,uCAAuC,KAAK,GAAG,KAAK,MAAM;SACnE;AACL,WAAQ,MAAM,iCAAiC;AAC/C,SAAM,OAAO,MAAM,EACjB,eAAe,SAChB,CAAC;;UAEG,OAAO;AACd,UAAQ,MAAM,mCAAmC,MAAM;AACvD,UAAQ,KAAK,EAAE;;;AAInB,QAAQ,GAAG,gBAAgB;AACzB,SAAQ,MAAM,iDAAiD;AAC/D,SAAQ,KAAK,EAAE;EACf;AAEF,QAAQ,GAAG,iBAAiB;AAC1B,SAAQ,MAAM,iDAAiD;AAC/D,SAAQ,KAAK,EAAE;EACf;AAEF,MAAM,CAAC,MAAM,QAAQ,MAAM"}
|
package/package.json
CHANGED