@soyrageagency/docker-mcp 1.1.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.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +882 -0
  3. package/dist/ai/credentials.d.ts +72 -0
  4. package/dist/ai/credentials.js +157 -0
  5. package/dist/ai/credentials.js.map +1 -0
  6. package/dist/ai/login.d.ts +22 -0
  7. package/dist/ai/login.js +189 -0
  8. package/dist/ai/login.js.map +1 -0
  9. package/dist/ai/provider.d.ts +29 -0
  10. package/dist/ai/provider.js +113 -0
  11. package/dist/ai/provider.js.map +1 -0
  12. package/dist/assets.d.ts +20 -0
  13. package/dist/assets.js +56 -0
  14. package/dist/assets.js.map +1 -0
  15. package/dist/branding.d.ts +31 -0
  16. package/dist/branding.js +61 -0
  17. package/dist/branding.js.map +1 -0
  18. package/dist/config.d.ts +65 -0
  19. package/dist/config.js +128 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/docker/client.d.ts +66 -0
  22. package/dist/docker/client.js +161 -0
  23. package/dist/docker/client.js.map +1 -0
  24. package/dist/docker/compose.d.ts +74 -0
  25. package/dist/docker/compose.js +126 -0
  26. package/dist/docker/compose.js.map +1 -0
  27. package/dist/entry.d.ts +15 -0
  28. package/dist/entry.js +33 -0
  29. package/dist/entry.js.map +1 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.js +100 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/logger.d.ts +25 -0
  34. package/dist/logger.js +68 -0
  35. package/dist/logger.js.map +1 -0
  36. package/dist/panel/index.d.ts +16 -0
  37. package/dist/panel/index.js +53 -0
  38. package/dist/panel/index.js.map +1 -0
  39. package/dist/panel/public/app.js +1004 -0
  40. package/dist/panel/public/index.html +243 -0
  41. package/dist/panel/public/styles.css +428 -0
  42. package/dist/panel/server.d.ts +23 -0
  43. package/dist/panel/server.js +355 -0
  44. package/dist/panel/server.js.map +1 -0
  45. package/dist/panel/service.d.ts +327 -0
  46. package/dist/panel/service.js +1356 -0
  47. package/dist/panel/service.js.map +1 -0
  48. package/dist/plugins.d.ts +50 -0
  49. package/dist/plugins.js +121 -0
  50. package/dist/plugins.js.map +1 -0
  51. package/dist/ragedocker.d.ts +21 -0
  52. package/dist/ragedocker.js +164 -0
  53. package/dist/ragedocker.js.map +1 -0
  54. package/dist/tools/about.d.ts +15 -0
  55. package/dist/tools/about.js +55 -0
  56. package/dist/tools/about.js.map +1 -0
  57. package/dist/tools/compose.d.ts +19 -0
  58. package/dist/tools/compose.js +145 -0
  59. package/dist/tools/compose.js.map +1 -0
  60. package/dist/tools/containers.d.ts +13 -0
  61. package/dist/tools/containers.js +119 -0
  62. package/dist/tools/containers.js.map +1 -0
  63. package/dist/tools/context.d.ts +37 -0
  64. package/dist/tools/context.js +13 -0
  65. package/dist/tools/context.js.map +1 -0
  66. package/dist/tools/images.d.ts +11 -0
  67. package/dist/tools/images.js +38 -0
  68. package/dist/tools/images.js.map +1 -0
  69. package/dist/tools/index.d.ts +15 -0
  70. package/dist/tools/index.js +34 -0
  71. package/dist/tools/index.js.map +1 -0
  72. package/dist/tools/lifecycle.d.ts +16 -0
  73. package/dist/tools/lifecycle.js +165 -0
  74. package/dist/tools/lifecycle.js.map +1 -0
  75. package/dist/tools/logs.d.ts +15 -0
  76. package/dist/tools/logs.js +110 -0
  77. package/dist/tools/logs.js.map +1 -0
  78. package/dist/tools/system.d.ts +14 -0
  79. package/dist/tools/system.js +108 -0
  80. package/dist/tools/system.js.map +1 -0
  81. package/dist/tui/ansi.d.ts +66 -0
  82. package/dist/tui/ansi.js +118 -0
  83. package/dist/tui/ansi.js.map +1 -0
  84. package/dist/tui/app.d.ts +160 -0
  85. package/dist/tui/app.js +1339 -0
  86. package/dist/tui/app.js.map +1 -0
  87. package/dist/tui/box.d.ts +18 -0
  88. package/dist/tui/box.js +38 -0
  89. package/dist/tui/box.js.map +1 -0
  90. package/dist/tui/index.d.ts +19 -0
  91. package/dist/tui/index.js +66 -0
  92. package/dist/tui/index.js.map +1 -0
  93. package/dist/update/channel.d.ts +82 -0
  94. package/dist/update/channel.js +178 -0
  95. package/dist/update/channel.js.map +1 -0
  96. package/dist/updates.json +42 -0
  97. package/dist/utils/format.d.ts +24 -0
  98. package/dist/utils/format.js +69 -0
  99. package/dist/utils/format.js.map +1 -0
  100. package/dist/utils/result.d.ts +35 -0
  101. package/dist/utils/result.js +31 -0
  102. package/dist/utils/result.js.map +1 -0
  103. package/package.json +90 -0
  104. package/scripts/install.mjs +132 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Interactive panel — HTTP server & REST API.
3
+ *
4
+ * A tiny, dependency-free HTTP server (Node core only) that serves the static
5
+ * single-page dashboard and a small JSON API backed by {@link PanelService}.
6
+ * It is intentionally minimal and read-mostly; state-changing endpoints honour
7
+ * the server's read-only mode.
8
+ *
9
+ * Bind address defaults to 127.0.0.1 so the panel is local-only unless you
10
+ * deliberately expose it.
11
+ *
12
+ * Part of Docker MCP Server.
13
+ * Crafted by SoyRage Agency — https://soyrage.es/
14
+ * MIT licensed (see LICENSE).
15
+ */
16
+ import { type IncomingMessage, type ServerResponse } from "node:http";
17
+ import type { AppConfig } from "../config.js";
18
+ import type { Logger } from "../logger.js";
19
+ import { PanelService } from "./service.js";
20
+ /** Build the panel HTTP server (not yet listening). */
21
+ export declare function createPanelServer(service: PanelService, config: AppConfig, logger: Logger): import("http").Server<typeof IncomingMessage, typeof ServerResponse>;
22
+ /** Start the panel and log its URL. Resolves once listening. */
23
+ export declare function startPanel(service: PanelService, config: AppConfig, logger: Logger): Promise<void>;
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Interactive panel — HTTP server & REST API.
3
+ *
4
+ * A tiny, dependency-free HTTP server (Node core only) that serves the static
5
+ * single-page dashboard and a small JSON API backed by {@link PanelService}.
6
+ * It is intentionally minimal and read-mostly; state-changing endpoints honour
7
+ * the server's read-only mode.
8
+ *
9
+ * Bind address defaults to 127.0.0.1 so the panel is local-only unless you
10
+ * deliberately expose it.
11
+ *
12
+ * Part of Docker MCP Server.
13
+ * Crafted by SoyRage Agency — https://soyrage.es/
14
+ * MIT licensed (see LICENSE).
15
+ */
16
+ import { createServer } from "node:http";
17
+ import { readFile } from "node:fs/promises";
18
+ import { existsSync } from "node:fs";
19
+ import { networkInterfaces } from "node:os";
20
+ import { dirname, extname, join, normalize, resolve } from "node:path";
21
+ import { fileURLToPath } from "node:url";
22
+ import { BRAND } from "../branding.js";
23
+ import { checkForUpdate } from "../update/channel.js";
24
+ import { isPackaged, readAssetBuffer } from "../assets.js";
25
+ /** Directory holding the static SPA assets (index.html, app.js, styles.css). */
26
+ const PUBLIC_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "public");
27
+ const MIME = {
28
+ ".html": "text/html; charset=utf-8",
29
+ ".css": "text/css; charset=utf-8",
30
+ ".js": "text/javascript; charset=utf-8",
31
+ ".svg": "image/svg+xml",
32
+ ".json": "application/json; charset=utf-8",
33
+ ".ico": "image/x-icon",
34
+ };
35
+ /** Write a JSON response. */
36
+ function sendJson(res, status, body) {
37
+ const payload = JSON.stringify(body);
38
+ res.writeHead(status, {
39
+ "Content-Type": "application/json; charset=utf-8",
40
+ "Cache-Control": "no-store",
41
+ });
42
+ res.end(payload);
43
+ }
44
+ /** Read and parse a JSON request body (bounded to 64 KB). */
45
+ function readBody(req) {
46
+ return new Promise((resolvePromise, rejectPromise) => {
47
+ let data = "";
48
+ req.on("data", (chunk) => {
49
+ data += chunk;
50
+ if (data.length > 65_536) {
51
+ rejectPromise(new Error("Request body too large."));
52
+ req.destroy();
53
+ }
54
+ });
55
+ req.on("end", () => {
56
+ if (!data)
57
+ return resolvePromise({});
58
+ try {
59
+ resolvePromise(JSON.parse(data));
60
+ }
61
+ catch {
62
+ rejectPromise(new Error("Invalid JSON body."));
63
+ }
64
+ });
65
+ req.on("error", rejectPromise);
66
+ });
67
+ }
68
+ /** Serve a static asset, guarding against path traversal. Works from disk or,
69
+ * when running as a standalone binary, from the embedded SEA assets. */
70
+ async function serveStatic(res, urlPath) {
71
+ const rel = urlPath === "/" ? "index.html" : urlPath.replace(/^\/+/, "");
72
+ const target = normalize(join(PUBLIC_DIR, rel));
73
+ // Path-traversal guard still applies to the derived key.
74
+ if (!target.startsWith(PUBLIC_DIR)) {
75
+ res.writeHead(404, { "Content-Type": "text/plain" });
76
+ res.end("Not found");
77
+ return;
78
+ }
79
+ let body;
80
+ if (isPackaged()) {
81
+ try {
82
+ body = readAssetBuffer(`public/${rel}`, target);
83
+ }
84
+ catch {
85
+ res.writeHead(404, { "Content-Type": "text/plain" });
86
+ res.end("Not found");
87
+ return;
88
+ }
89
+ }
90
+ else {
91
+ if (!existsSync(target)) {
92
+ res.writeHead(404, { "Content-Type": "text/plain" });
93
+ res.end("Not found");
94
+ return;
95
+ }
96
+ body = await readFile(target);
97
+ }
98
+ res.writeHead(200, {
99
+ "Content-Type": MIME[extname(target)] ?? "application/octet-stream",
100
+ });
101
+ res.end(body);
102
+ }
103
+ /** Build the panel HTTP server (not yet listening). */
104
+ export function createPanelServer(service, config, logger) {
105
+ const log = logger.child("panel");
106
+ return createServer(async (req, res) => {
107
+ const url = new URL(req.url ?? "/", "http://localhost");
108
+ const path = url.pathname;
109
+ try {
110
+ // ---- REST API ------------------------------------------------------
111
+ if (path === "/api/meta") {
112
+ return sendJson(res, 200, {
113
+ product: BRAND.product,
114
+ author: BRAND.author,
115
+ url: BRAND.url,
116
+ version: BRAND.version,
117
+ demo: service.isDemo,
118
+ readOnly: service.isReadOnly,
119
+ terminal: config.panel.terminal,
120
+ backupDir: config.panel.backupDir,
121
+ ai: service.aiEnabled,
122
+ });
123
+ }
124
+ // Prometheus / Zabbix scrape endpoint.
125
+ if (path === "/metrics") {
126
+ if (!config.panel.metrics) {
127
+ res.writeHead(404, { "Content-Type": "text/plain" });
128
+ res.end("metrics disabled");
129
+ return;
130
+ }
131
+ const body = await service.prometheus();
132
+ res.writeHead(200, {
133
+ "Content-Type": "text/plain; version=0.0.4; charset=utf-8",
134
+ "Cache-Control": "no-store",
135
+ });
136
+ res.end(body);
137
+ return;
138
+ }
139
+ if (path === "/api/system") {
140
+ return sendJson(res, 200, await service.system());
141
+ }
142
+ // Update & announcement channel (silent on failure → null status).
143
+ if (path === "/api/updates") {
144
+ const force = url.searchParams.get("force") === "1";
145
+ return sendJson(res, 200, { status: await checkForUpdate({ force }) });
146
+ }
147
+ if (path === "/api/snapshot") {
148
+ return sendJson(res, 200, await service.snapshot());
149
+ }
150
+ if (path === "/api/history") {
151
+ return sendJson(res, 200, { points: service.getHistory() });
152
+ }
153
+ if (path === "/api/containers") {
154
+ return sendJson(res, 200, await service.containers());
155
+ }
156
+ if (path === "/api/images") {
157
+ return sendJson(res, 200, await service.images());
158
+ }
159
+ if (path === "/api/logs") {
160
+ const name = url.searchParams.get("name") ?? "";
161
+ if (!name)
162
+ return sendJson(res, 400, { error: "Missing ?name=" });
163
+ const tail = Number(url.searchParams.get("tail") ?? config.defaultLogTail);
164
+ return sendJson(res, 200, { logs: await service.logs(name, tail) });
165
+ }
166
+ // ---- Alerts --------------------------------------------------------
167
+ if (path === "/api/alerts") {
168
+ return sendJson(res, 200, { alerts: await service.alerts() });
169
+ }
170
+ // ---- File explorer -------------------------------------------------
171
+ if (path === "/api/files") {
172
+ const name = url.searchParams.get("name") ?? "";
173
+ if (!name)
174
+ return sendJson(res, 400, { error: "Missing ?name=" });
175
+ const dir = url.searchParams.get("path") ?? "/";
176
+ return sendJson(res, 200, await service.listFiles(name, dir));
177
+ }
178
+ if (path === "/api/file" && req.method === "POST") {
179
+ const body = (await readBody(req));
180
+ if (!body.name || !body.path || typeof body.content !== "string") {
181
+ return sendJson(res, 400, { error: "Expected { name, path, content }." });
182
+ }
183
+ return sendJson(res, 200, await service.writeFile(body.name, body.path, body.content));
184
+ }
185
+ if (path === "/api/file") {
186
+ const name = url.searchParams.get("name") ?? "";
187
+ const file = url.searchParams.get("path") ?? "";
188
+ if (!name || !file)
189
+ return sendJson(res, 400, { error: "Missing ?name= or ?path=" });
190
+ return sendJson(res, 200, await service.readFile(name, file));
191
+ }
192
+ // ---- AI copilot ----------------------------------------------------
193
+ if (path === "/api/ai" && req.method === "POST") {
194
+ const body = (await readBody(req));
195
+ if (!body.prompt)
196
+ return sendJson(res, 400, { error: "Expected { mode, prompt, context? }." });
197
+ const mode = body.mode === "edit" ? "edit" : "command";
198
+ return sendJson(res, 200, await service.aiAssist(mode, body.prompt, body.context ?? ""));
199
+ }
200
+ // ---- Auto-restart --------------------------------------------------
201
+ if (path === "/api/autorestart" && req.method === "GET") {
202
+ return sendJson(res, 200, { enabled: service.autoRestartList() });
203
+ }
204
+ if (path === "/api/autorestart" && req.method === "POST") {
205
+ const body = (await readBody(req));
206
+ if (!body.name)
207
+ return sendJson(res, 400, { error: "Expected { name, enabled }." });
208
+ service.setAutoRestart(body.name, body.enabled !== false);
209
+ return sendJson(res, 200, { ok: true, enabled: service.autoRestartList() });
210
+ }
211
+ // ---- Details, networks & volumes -----------------------------------
212
+ if (path === "/api/inspect") {
213
+ const name = url.searchParams.get("name") ?? "";
214
+ if (!name)
215
+ return sendJson(res, 400, { error: "Missing ?name=" });
216
+ return sendJson(res, 200, await service.inspectSummary(name));
217
+ }
218
+ if (path === "/api/networks") {
219
+ return sendJson(res, 200, { networks: await service.networks() });
220
+ }
221
+ if (path === "/api/volumes") {
222
+ return sendJson(res, 200, { volumes: await service.volumes() });
223
+ }
224
+ // ---- Terminal (command runner) -------------------------------------
225
+ if (path === "/api/run" && req.method === "POST") {
226
+ if (!config.panel.terminal)
227
+ return sendJson(res, 403, { error: "Terminal disabled (DOCKER_MCP_PANEL_TERMINAL=false)." });
228
+ const body = (await readBody(req));
229
+ if (!body.command)
230
+ return sendJson(res, 400, { error: "Expected { command }." });
231
+ return sendJson(res, 200, await service.runCommand(body.command));
232
+ }
233
+ // ---- Snapshots & scheduled backups ---------------------------------
234
+ if (path === "/api/backups") {
235
+ return sendJson(res, 200, { snapshots: service.listSnapshots() });
236
+ }
237
+ if (path === "/api/backup" && req.method === "POST") {
238
+ const body = (await readBody(req));
239
+ if (!body.container)
240
+ return sendJson(res, 400, { error: "Expected { container, type }." });
241
+ return sendJson(res, 200, await service.createSnapshot(body.container, body.type === "export" ? "export" : "commit"));
242
+ }
243
+ if (path === "/api/schedule" && req.method === "GET") {
244
+ return sendJson(res, 200, service.getSchedule());
245
+ }
246
+ if (path === "/api/schedule" && req.method === "POST") {
247
+ const body = (await readBody(req));
248
+ return sendJson(res, 200, service.setSchedule(body));
249
+ }
250
+ // ---- Restore a snapshot -------------------------------------------
251
+ if (path === "/api/restore" && req.method === "POST") {
252
+ const body = (await readBody(req));
253
+ if (!body.id)
254
+ return sendJson(res, 400, { error: "Expected { id }." });
255
+ return sendJson(res, 200, await service.restoreSnapshot(body.id));
256
+ }
257
+ // ---- Exec a one-off command inside a container --------------------
258
+ if (path === "/api/exec" && req.method === "POST") {
259
+ const body = (await readBody(req));
260
+ if (!body.name || !body.command)
261
+ return sendJson(res, 400, { error: "Expected { name, command }." });
262
+ return sendJson(res, 200, await service.execOnce(body.name, body.command));
263
+ }
264
+ // ---- Compose file editor & lifecycle ------------------------------
265
+ if (path === "/api/compose/list") {
266
+ return sendJson(res, 200, { files: service.findComposeFiles() });
267
+ }
268
+ if (path === "/api/compose" && req.method === "POST") {
269
+ const body = (await readBody(req));
270
+ if (!body.path || typeof body.content !== "string")
271
+ return sendJson(res, 400, { error: "Expected { path, content }." });
272
+ return sendJson(res, 200, service.writeComposeFile(body.path, body.content));
273
+ }
274
+ if (path === "/api/compose") {
275
+ const file = url.searchParams.get("path") ?? "";
276
+ if (!file)
277
+ return sendJson(res, 400, { error: "Missing ?path=" });
278
+ return sendJson(res, 200, service.readComposeFile(file));
279
+ }
280
+ if (path === "/api/compose/action" && req.method === "POST") {
281
+ const body = (await readBody(req));
282
+ const valid = ["up", "down", "restart"];
283
+ if (!body.path || !valid.includes(body.action ?? ""))
284
+ return sendJson(res, 400, { error: "Expected { path, action: up|down|restart }." });
285
+ return sendJson(res, 200, await service.composeAction(body.path, body.action));
286
+ }
287
+ // ---- Attach an extra volume (guided recreate) ---------------------
288
+ if (path === "/api/volume/attach" && req.method === "POST") {
289
+ const body = (await readBody(req));
290
+ if (!body.name || !body.hostPath || !body.containerPath)
291
+ return sendJson(res, 400, { error: "Expected { name, hostPath, containerPath, readOnly? }." });
292
+ return sendJson(res, 200, await service.attachVolume(body.name, body.hostPath, body.containerPath, Boolean(body.readOnly)));
293
+ }
294
+ if (path === "/api/action" && req.method === "POST") {
295
+ const body = (await readBody(req));
296
+ const valid = ["start", "stop", "restart"];
297
+ if (!body.name || !valid.includes(body.action)) {
298
+ return sendJson(res, 400, { error: "Expected { name, action }." });
299
+ }
300
+ await service.act(body.name, body.action);
301
+ return sendJson(res, 200, { ok: true });
302
+ }
303
+ // ---- Static SPA ----------------------------------------------------
304
+ if (req.method === "GET") {
305
+ return await serveStatic(res, path);
306
+ }
307
+ res.writeHead(405, { "Content-Type": "text/plain" });
308
+ res.end("Method not allowed");
309
+ }
310
+ catch (error) {
311
+ const message = error instanceof Error ? error.message : "Internal server error";
312
+ log.error(`Request ${path} failed`, error);
313
+ sendJson(res, 500, { error: message });
314
+ }
315
+ });
316
+ }
317
+ /** Enumerate the IPv4 URLs the panel is reachable on (for a 0.0.0.0 bind). */
318
+ function reachableUrls(port) {
319
+ const urls = [`http://127.0.0.1:${port}`];
320
+ const ifaces = networkInterfaces();
321
+ for (const addrs of Object.values(ifaces)) {
322
+ for (const a of addrs ?? []) {
323
+ if (a.family === "IPv4" && !a.internal)
324
+ urls.push(`http://${a.address}:${port}`);
325
+ }
326
+ }
327
+ return urls;
328
+ }
329
+ /** Start the panel and log its URL. Resolves once listening. */
330
+ export function startPanel(service, config, logger) {
331
+ const server = createPanelServer(service, config, logger);
332
+ const { host, port } = config.panel;
333
+ // Kick off the auto-restart watchdog, backup scheduler and metrics sampler.
334
+ service.startWatchdog();
335
+ service.startScheduler();
336
+ service.startSampler();
337
+ return new Promise((resolvePromise) => {
338
+ server.listen(port, host, () => {
339
+ logger.info(`Panel ready at http://${host}:${port}`);
340
+ // If bound to all interfaces, list the reachable addresses and warn
341
+ // about exposure — the panel is powerful and should sit behind a VPN.
342
+ if (host === "0.0.0.0" || host === "::") {
343
+ for (const url of reachableUrls(port))
344
+ logger.info(` reachable at ${url}`);
345
+ logger.warn("Panel is bound to ALL interfaces. Do NOT expose it to the public Internet — " +
346
+ "keep it behind a VPN (WireGuard/Tailscale) or an authenticated reverse proxy.");
347
+ }
348
+ if (config.panel.metrics) {
349
+ logger.info(`Prometheus metrics at http://${host}:${port}/metrics`);
350
+ }
351
+ resolvePromise();
352
+ });
353
+ });
354
+ }
355
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/panel/server.ts"],"names":[],"mappings":"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"}