@minecraft-docker/mcctl 1.6.1 → 1.6.2

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 (90) hide show
  1. package/dist/commands/console/api.d.ts +19 -0
  2. package/dist/commands/console/api.d.ts.map +1 -0
  3. package/dist/commands/console/api.js +399 -0
  4. package/dist/commands/console/api.js.map +1 -0
  5. package/dist/commands/console/index.d.ts +10 -0
  6. package/dist/commands/console/index.d.ts.map +1 -0
  7. package/dist/commands/console/index.js +12 -0
  8. package/dist/commands/console/index.js.map +1 -0
  9. package/dist/commands/console/init.d.ts +47 -0
  10. package/dist/commands/console/init.d.ts.map +1 -0
  11. package/dist/commands/console/init.js +491 -0
  12. package/dist/commands/console/init.js.map +1 -0
  13. package/dist/commands/console/remove.d.ts +25 -0
  14. package/dist/commands/console/remove.d.ts.map +1 -0
  15. package/dist/commands/console/remove.js +189 -0
  16. package/dist/commands/console/remove.js.map +1 -0
  17. package/dist/commands/console/service.d.ts +40 -0
  18. package/dist/commands/console/service.d.ts.map +1 -0
  19. package/dist/commands/console/service.js +321 -0
  20. package/dist/commands/console/service.js.map +1 -0
  21. package/dist/commands/console/user.d.ts +17 -0
  22. package/dist/commands/console/user.d.ts.map +1 -0
  23. package/dist/commands/console/user.js +431 -0
  24. package/dist/commands/console/user.js.map +1 -0
  25. package/dist/commands/create.d.ts.map +1 -1
  26. package/dist/commands/create.js +4 -1
  27. package/dist/commands/create.js.map +1 -1
  28. package/dist/commands/delete.d.ts.map +1 -1
  29. package/dist/commands/delete.js +4 -1
  30. package/dist/commands/delete.js.map +1 -1
  31. package/dist/commands/index.d.ts +3 -0
  32. package/dist/commands/index.d.ts.map +1 -1
  33. package/dist/commands/index.js +5 -0
  34. package/dist/commands/index.js.map +1 -1
  35. package/dist/commands/init.d.ts.map +1 -1
  36. package/dist/commands/init.js +58 -26
  37. package/dist/commands/init.js.map +1 -1
  38. package/dist/commands/mod.d.ts +19 -0
  39. package/dist/commands/mod.d.ts.map +1 -0
  40. package/dist/commands/mod.js +441 -0
  41. package/dist/commands/mod.js.map +1 -0
  42. package/dist/commands/msg.d.ts +12 -0
  43. package/dist/commands/msg.d.ts.map +1 -0
  44. package/dist/commands/msg.js +273 -0
  45. package/dist/commands/msg.js.map +1 -0
  46. package/dist/commands/player-online.js +4 -2
  47. package/dist/commands/player-online.js.map +1 -1
  48. package/dist/commands/world.d.ts +2 -0
  49. package/dist/commands/world.d.ts.map +1 -1
  50. package/dist/commands/world.js +104 -1
  51. package/dist/commands/world.js.map +1 -1
  52. package/dist/index.js +162 -5
  53. package/dist/index.js.map +1 -1
  54. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +2 -1
  55. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -1
  56. package/dist/infrastructure/adapters/ClackPromptAdapter.js +11 -0
  57. package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -1
  58. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
  59. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
  60. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
  61. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
  62. package/dist/infrastructure/adapters/index.d.ts +1 -0
  63. package/dist/infrastructure/adapters/index.d.ts.map +1 -1
  64. package/dist/infrastructure/adapters/index.js +2 -1
  65. package/dist/infrastructure/adapters/index.js.map +1 -1
  66. package/dist/infrastructure/index.d.ts +1 -0
  67. package/dist/infrastructure/index.d.ts.map +1 -1
  68. package/dist/infrastructure/index.js +2 -1
  69. package/dist/infrastructure/index.js.map +1 -1
  70. package/dist/lib/admin-config.d.ts +66 -0
  71. package/dist/lib/admin-config.d.ts.map +1 -0
  72. package/dist/lib/admin-config.js +130 -0
  73. package/dist/lib/admin-config.js.map +1 -0
  74. package/dist/lib/pm2-utils.d.ts +71 -0
  75. package/dist/lib/pm2-utils.d.ts.map +1 -0
  76. package/dist/lib/pm2-utils.js +155 -0
  77. package/dist/lib/pm2-utils.js.map +1 -0
  78. package/dist/lib/prompts/ip-select.d.ts +25 -0
  79. package/dist/lib/prompts/ip-select.d.ts.map +1 -0
  80. package/dist/lib/prompts/ip-select.js +255 -0
  81. package/dist/lib/prompts/ip-select.js.map +1 -0
  82. package/dist/lib/shell.d.ts +2 -0
  83. package/dist/lib/shell.d.ts.map +1 -1
  84. package/dist/lib/shell.js +7 -4
  85. package/dist/lib/shell.js.map +1 -1
  86. package/dist/lib/sudo-utils.d.ts +14 -0
  87. package/dist/lib/sudo-utils.d.ts.map +1 -0
  88. package/dist/lib/sudo-utils.js +53 -0
  89. package/dist/lib/sudo-utils.js.map +1 -0
  90. package/package.json +8 -2
@@ -0,0 +1,391 @@
1
+ /**
2
+ * PM2 Service Manager Adapter
3
+ *
4
+ * Implements IServiceManagerPort using PM2 for process management.
5
+ * Manages mcctl-api and mcctl-console services via PM2.
6
+ */
7
+ import pm2 from 'pm2';
8
+ import { existsSync } from 'node:fs';
9
+ import { ProcessInfo, } from '@minecraft-docker/shared';
10
+ import { getEcosystemConfigPath, getPm2LogPaths, readLogFile, normalizePm2Status, formatPm2Error, PM2_SERVICE_NAMES, } from '../../lib/pm2-utils.js';
11
+ /**
12
+ * Promisified PM2 functions
13
+ */
14
+ function pm2Connect(noDaemonMode = false) {
15
+ return new Promise((resolve, reject) => {
16
+ pm2.connect(noDaemonMode, (err) => {
17
+ if (err)
18
+ reject(err);
19
+ else
20
+ resolve();
21
+ });
22
+ });
23
+ }
24
+ function pm2List() {
25
+ return new Promise((resolve, reject) => {
26
+ pm2.list((err, list) => {
27
+ if (err)
28
+ reject(err);
29
+ else
30
+ resolve(list);
31
+ });
32
+ });
33
+ }
34
+ function pm2Start(options) {
35
+ return new Promise((resolve, reject) => {
36
+ pm2.start(options, (err, proc) => {
37
+ if (err)
38
+ reject(err);
39
+ else
40
+ resolve(proc);
41
+ });
42
+ });
43
+ }
44
+ function pm2StartConfig(configPath, appName) {
45
+ return new Promise((resolve, reject) => {
46
+ if (appName) {
47
+ // Start only the specific app from config
48
+ pm2.start(configPath, { only: [appName] }, (err, proc) => {
49
+ if (err)
50
+ reject(err);
51
+ else
52
+ resolve(proc);
53
+ });
54
+ }
55
+ else {
56
+ // Start all apps from config
57
+ pm2.start(configPath, (err, proc) => {
58
+ if (err)
59
+ reject(err);
60
+ else
61
+ resolve(proc);
62
+ });
63
+ }
64
+ });
65
+ }
66
+ function pm2Stop(name) {
67
+ return new Promise((resolve, reject) => {
68
+ pm2.stop(name, (err, proc) => {
69
+ if (err)
70
+ reject(err);
71
+ else
72
+ resolve(proc);
73
+ });
74
+ });
75
+ }
76
+ function pm2Restart(name) {
77
+ return new Promise((resolve, reject) => {
78
+ pm2.restart(name, (err, proc) => {
79
+ if (err)
80
+ reject(err);
81
+ else
82
+ resolve(proc);
83
+ });
84
+ });
85
+ }
86
+ function pm2Delete(name) {
87
+ return new Promise((resolve, reject) => {
88
+ pm2.delete(name, (err, proc) => {
89
+ if (err)
90
+ reject(err);
91
+ else
92
+ resolve(proc);
93
+ });
94
+ });
95
+ }
96
+ function pm2Describe(name) {
97
+ return new Promise((resolve, reject) => {
98
+ pm2.describe(name, (err, desc) => {
99
+ if (err)
100
+ reject(err);
101
+ else
102
+ resolve(desc);
103
+ });
104
+ });
105
+ }
106
+ function pm2Flush(name) {
107
+ return new Promise((resolve, reject) => {
108
+ pm2.flush(name, (err) => {
109
+ if (err)
110
+ reject(err);
111
+ else
112
+ resolve();
113
+ });
114
+ });
115
+ }
116
+ function pm2Dump() {
117
+ return new Promise((resolve, reject) => {
118
+ pm2.dump((err) => {
119
+ if (err)
120
+ reject(err);
121
+ else
122
+ resolve();
123
+ });
124
+ });
125
+ }
126
+ /**
127
+ * PM2 Service Manager Adapter
128
+ * Implements IServiceManagerPort for managing services via PM2
129
+ */
130
+ export class Pm2ServiceManagerAdapter {
131
+ connected = false;
132
+ paths;
133
+ constructor(paths) {
134
+ this.paths = paths;
135
+ }
136
+ /**
137
+ * Ensure connected to PM2 daemon
138
+ */
139
+ async ensureConnected() {
140
+ if (!this.connected) {
141
+ await pm2Connect(false);
142
+ this.connected = true;
143
+ }
144
+ }
145
+ /**
146
+ * Disconnect from PM2 daemon
147
+ */
148
+ disconnect() {
149
+ if (this.connected) {
150
+ pm2.disconnect();
151
+ this.connected = false;
152
+ }
153
+ }
154
+ /**
155
+ * Wait for a service to become online
156
+ * @param name - Service name
157
+ * @param timeout - Timeout in milliseconds
158
+ */
159
+ async waitForOnline(name, timeout) {
160
+ const startTime = Date.now();
161
+ while (Date.now() - startTime < timeout) {
162
+ const procs = await pm2List();
163
+ const proc = procs.find((p) => p.name === name);
164
+ if (proc?.pm2_env?.status === 'online') {
165
+ return;
166
+ }
167
+ await new Promise((resolve) => setTimeout(resolve, 500));
168
+ }
169
+ throw new Error(`Timeout waiting for ${name} to be ready`);
170
+ }
171
+ /**
172
+ * Start a service by name
173
+ */
174
+ async start(name, options) {
175
+ try {
176
+ await this.ensureConnected();
177
+ // Check if already running
178
+ const processes = await pm2List();
179
+ const existing = processes.find((p) => p.name === name);
180
+ if (existing && existing.pm2_env?.status === 'online') {
181
+ // Already running, no action needed
182
+ return;
183
+ }
184
+ if (existing) {
185
+ // Process exists but stopped, restart it
186
+ await pm2Restart(name);
187
+ // Wait for ready if requested (same logic as new process start)
188
+ if (options?.wait) {
189
+ await this.waitForOnline(name, options.waitTimeout || 30000);
190
+ }
191
+ return;
192
+ }
193
+ // Start from ecosystem config
194
+ const configPath = getEcosystemConfigPath(this.paths);
195
+ if (!existsSync(configPath)) {
196
+ throw new Error(`Ecosystem config not found: ${configPath}. Run 'mcctl console init' first.`);
197
+ }
198
+ // Start the specific app from config (not all apps)
199
+ await pm2StartConfig(configPath, name);
200
+ // Wait for ready if requested
201
+ if (options?.wait) {
202
+ await this.waitForOnline(name, options.waitTimeout || 30000);
203
+ }
204
+ }
205
+ catch (error) {
206
+ throw new Error(`Failed to start ${name}: ${formatPm2Error(error)}`);
207
+ }
208
+ }
209
+ /**
210
+ * Stop a service by name
211
+ * @throws Error if service not found (as per IServiceManagerPort contract)
212
+ */
213
+ async stop(name, options) {
214
+ try {
215
+ await this.ensureConnected();
216
+ // Check if process exists - throw if not found (interface contract)
217
+ const exists = await this.exists(name);
218
+ if (!exists) {
219
+ throw new Error(`Service '${name}' not found`);
220
+ }
221
+ if (options?.force) {
222
+ // Force stop: delete the process
223
+ await pm2Delete(name);
224
+ }
225
+ else {
226
+ // Graceful stop
227
+ await pm2Stop(name);
228
+ }
229
+ }
230
+ catch (error) {
231
+ throw new Error(`Failed to stop ${name}: ${formatPm2Error(error)}`);
232
+ }
233
+ }
234
+ /**
235
+ * Restart a service by name
236
+ */
237
+ async restart(name, options) {
238
+ try {
239
+ await this.ensureConnected();
240
+ // Check if process exists
241
+ const exists = await this.exists(name);
242
+ if (!exists) {
243
+ // Not running, start instead
244
+ await this.start(name, options);
245
+ return;
246
+ }
247
+ await pm2Restart(name);
248
+ // Wait for ready if requested
249
+ if (options?.wait) {
250
+ await this.waitForOnline(name, options.waitTimeout || 30000);
251
+ }
252
+ }
253
+ catch (error) {
254
+ throw new Error(`Failed to restart ${name}: ${formatPm2Error(error)}`);
255
+ }
256
+ }
257
+ /**
258
+ * Get status of one or all services
259
+ */
260
+ async status(name) {
261
+ try {
262
+ await this.ensureConnected();
263
+ let processes;
264
+ if (name) {
265
+ try {
266
+ processes = await pm2Describe(name);
267
+ }
268
+ catch {
269
+ // Process not found
270
+ return [];
271
+ }
272
+ }
273
+ else {
274
+ processes = await pm2List();
275
+ // Filter to only our services
276
+ processes = processes.filter((p) => p.name === PM2_SERVICE_NAMES.API || p.name === PM2_SERVICE_NAMES.CONSOLE);
277
+ }
278
+ return processes.map((p) => ProcessInfo.create({
279
+ pmId: p.pm_id ?? 0,
280
+ name: p.name ?? 'unknown',
281
+ status: normalizePm2Status(p.pm2_env?.status ?? 'stopped'),
282
+ pid: p.pid,
283
+ cpu: p.monit?.cpu,
284
+ memory: p.monit?.memory,
285
+ uptime: p.pm2_env?.pm_uptime,
286
+ restarts: p.pm2_env?.restart_time,
287
+ interpreter: p.pm2_env?.exec_interpreter,
288
+ scriptPath: p.pm2_env?.pm_exec_path,
289
+ }));
290
+ }
291
+ catch (error) {
292
+ throw new Error(`Failed to get status: ${formatPm2Error(error)}`);
293
+ }
294
+ }
295
+ /**
296
+ * Get logs for a service
297
+ */
298
+ async logs(name, options) {
299
+ const logPaths = getPm2LogPaths(this.paths, name);
300
+ const lines = options?.lines ?? 100;
301
+ if (options?.err) {
302
+ return readLogFile(logPaths.error, lines);
303
+ }
304
+ // Return combined logs
305
+ const outLogs = readLogFile(logPaths.output, lines);
306
+ const errLogs = readLogFile(logPaths.error, lines);
307
+ if (outLogs && errLogs) {
308
+ return `=== stdout ===\n${outLogs}\n\n=== stderr ===\n${errLogs}`;
309
+ }
310
+ return outLogs || errLogs || 'No logs available';
311
+ }
312
+ /**
313
+ * Delete a service from PM2
314
+ */
315
+ async delete(name) {
316
+ try {
317
+ await this.ensureConnected();
318
+ const exists = await this.exists(name);
319
+ if (!exists) {
320
+ return;
321
+ }
322
+ await pm2Delete(name);
323
+ }
324
+ catch (error) {
325
+ throw new Error(`Failed to delete ${name}: ${formatPm2Error(error)}`);
326
+ }
327
+ }
328
+ /**
329
+ * Reload ecosystem configuration
330
+ */
331
+ async reload(configPath) {
332
+ try {
333
+ await this.ensureConnected();
334
+ if (!existsSync(configPath)) {
335
+ throw new Error(`Config file not found: ${configPath}`);
336
+ }
337
+ // Reload by restarting from config
338
+ await pm2StartConfig(configPath);
339
+ }
340
+ catch (error) {
341
+ throw new Error(`Failed to reload config: ${formatPm2Error(error)}`);
342
+ }
343
+ }
344
+ /**
345
+ * Check if a service exists in PM2
346
+ */
347
+ async exists(name) {
348
+ try {
349
+ await this.ensureConnected();
350
+ const processes = await pm2List();
351
+ return processes.some((p) => p.name === name);
352
+ }
353
+ catch {
354
+ return false;
355
+ }
356
+ }
357
+ /**
358
+ * Flush logs for a service
359
+ */
360
+ async flush(name) {
361
+ try {
362
+ await this.ensureConnected();
363
+ await pm2Flush(name);
364
+ }
365
+ catch (error) {
366
+ throw new Error(`Failed to flush logs for ${name}: ${formatPm2Error(error)}`);
367
+ }
368
+ }
369
+ /**
370
+ * Save current process list
371
+ */
372
+ async save() {
373
+ try {
374
+ await this.ensureConnected();
375
+ await pm2Dump();
376
+ }
377
+ catch (error) {
378
+ throw new Error(`Failed to save process list: ${formatPm2Error(error)}`);
379
+ }
380
+ }
381
+ /**
382
+ * Resurrect saved processes
383
+ * Note: This is typically done via 'pm2 resurrect' command
384
+ */
385
+ async resurrect() {
386
+ // PM2 doesn't have a direct API for resurrect
387
+ // It's typically done via CLI: pm2 resurrect
388
+ throw new Error('Resurrect is not supported via API. Use: pm2 resurrect');
389
+ }
390
+ }
391
+ //# sourceMappingURL=Pm2ServiceManagerAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pm2ServiceManagerAdapter.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/Pm2ServiceManagerAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export { ClackPromptAdapter } from './ClackPromptAdapter.js';
2
+ export { Pm2ServiceManagerAdapter } from './Pm2ServiceManagerAdapter.js';
2
3
  export { ShellAdapter, ServerRepository, WorldRepository, DocsAdapter, } from '@minecraft-docker/shared';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
@@ -1,5 +1,6 @@
1
- // CLI-specific adapter
1
+ // CLI-specific adapters
2
2
  export { ClackPromptAdapter } from './ClackPromptAdapter.js';
3
+ export { Pm2ServiceManagerAdapter } from './Pm2ServiceManagerAdapter.js';
3
4
  // Re-export shared adapters for backward compatibility
4
5
  export { ShellAdapter, ServerRepository, WorldRepository, DocsAdapter, } from '@minecraft-docker/shared';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,uDAAuD;AACvD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,uDAAuD;AACvD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { ClackPromptAdapter } from './adapters/ClackPromptAdapter.js';
2
+ export { Pm2ServiceManagerAdapter } from './adapters/Pm2ServiceManagerAdapter.js';
2
3
  export { ShellAdapter, ServerRepository, WorldRepository, DocsAdapter, } from '@minecraft-docker/shared';
3
4
  export { Container, getContainer, resetContainer } from './di/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/infrastructure/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/infrastructure/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -1,5 +1,6 @@
1
- // CLI-specific adapter
1
+ // CLI-specific adapters
2
2
  export { ClackPromptAdapter } from './adapters/ClackPromptAdapter.js';
3
+ export { Pm2ServiceManagerAdapter } from './adapters/Pm2ServiceManagerAdapter.js';
3
4
  // Re-export shared adapters for backward compatibility
4
5
  export { ShellAdapter, ServerRepository, WorldRepository, DocsAdapter, } from '@minecraft-docker/shared';
5
6
  // DI Container (CLI-specific)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infrastructure/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,uDAAuD;AACvD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infrastructure/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF,uDAAuD;AACvD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * API Access Mode
3
+ * Determines how the Admin API can be accessed
4
+ */
5
+ export type ApiAccessMode = 'internal' | 'api-key' | 'ip-whitelist' | 'api-key-ip' | 'open';
6
+ /**
7
+ * Admin Configuration structure stored in YAML
8
+ */
9
+ export interface AdminConfig {
10
+ version: string;
11
+ api: {
12
+ access_mode: ApiAccessMode;
13
+ port: number;
14
+ api_key: string | null;
15
+ allowed_ips: string[];
16
+ };
17
+ console: {
18
+ enabled: boolean;
19
+ port: number;
20
+ };
21
+ initialized_at: string;
22
+ }
23
+ /**
24
+ * AdminConfigManager
25
+ * Manages .mcctl-admin.yml configuration file
26
+ */
27
+ export declare class AdminConfigManager {
28
+ private readonly configPath;
29
+ constructor(rootDir?: string);
30
+ /**
31
+ * Get the configuration file path
32
+ */
33
+ get path(): string;
34
+ /**
35
+ * Check if admin service is already initialized
36
+ */
37
+ isInitialized(): boolean;
38
+ /**
39
+ * Load existing configuration
40
+ */
41
+ load(): Promise<AdminConfig | null>;
42
+ /**
43
+ * Save configuration to file
44
+ */
45
+ save(config: AdminConfig): Promise<void>;
46
+ /**
47
+ * Create a new configuration with specified options
48
+ */
49
+ create(options: {
50
+ accessMode: ApiAccessMode;
51
+ apiKey?: string | null;
52
+ allowedIps?: string[];
53
+ apiPort?: number;
54
+ consolePort?: number;
55
+ consoleEnabled?: boolean;
56
+ }): Promise<AdminConfig>;
57
+ /**
58
+ * Generate a new API key with mctk_ prefix
59
+ */
60
+ static generateApiKey(): string;
61
+ /**
62
+ * Validate an API key format
63
+ */
64
+ static isValidApiKey(key: string): boolean;
65
+ }
66
+ //# sourceMappingURL=admin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.d.ts","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,cAAc,GACd,YAAY,GACZ,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE;QACH,WAAW,EAAE,aAAa,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAoBD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,CAAC,EAAE,MAAM;IAK5B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAazC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9C;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE;QACpB,UAAU,EAAE,aAAa,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM;IAS/B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG3C"}
@@ -0,0 +1,130 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import * as yaml from 'js-yaml';
5
+ import { randomBytes } from 'node:crypto';
6
+ import { Paths } from '@minecraft-docker/shared';
7
+ /**
8
+ * Default configuration values
9
+ */
10
+ const DEFAULT_CONFIG = {
11
+ version: '1.0',
12
+ api: {
13
+ access_mode: 'internal',
14
+ port: 3001,
15
+ api_key: null,
16
+ allowed_ips: [],
17
+ },
18
+ console: {
19
+ enabled: true,
20
+ port: 3000,
21
+ },
22
+ initialized_at: new Date().toISOString(),
23
+ };
24
+ /**
25
+ * AdminConfigManager
26
+ * Manages .mcctl-admin.yml configuration file
27
+ */
28
+ export class AdminConfigManager {
29
+ configPath;
30
+ constructor(rootDir) {
31
+ const paths = new Paths(rootDir);
32
+ this.configPath = join(paths.root, '.mcctl-admin.yml');
33
+ }
34
+ /**
35
+ * Get the configuration file path
36
+ */
37
+ get path() {
38
+ return this.configPath;
39
+ }
40
+ /**
41
+ * Check if admin service is already initialized
42
+ */
43
+ isInitialized() {
44
+ return existsSync(this.configPath);
45
+ }
46
+ /**
47
+ * Load existing configuration
48
+ */
49
+ async load() {
50
+ if (!this.isInitialized()) {
51
+ return null;
52
+ }
53
+ try {
54
+ const content = await readFile(this.configPath, 'utf-8');
55
+ return yaml.load(content);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Save configuration to file
63
+ */
64
+ async save(config) {
65
+ // Ensure directory exists
66
+ const dir = dirname(this.configPath);
67
+ if (!existsSync(dir)) {
68
+ await mkdir(dir, { recursive: true });
69
+ }
70
+ const yamlContent = yaml.dump(config, {
71
+ indent: 2,
72
+ lineWidth: -1,
73
+ quotingType: '"',
74
+ forceQuotes: false,
75
+ });
76
+ // Add header comment
77
+ const header = `# mcctl Admin Service Configuration
78
+ # Generated by: mcctl admin init
79
+ # Do not edit this file manually unless you know what you are doing.
80
+ #
81
+ # API Access Modes:
82
+ # internal - Docker network only (default, most secure)
83
+ # api-key - External access with API key
84
+ # ip-whitelist - IP-based access control
85
+ # api-key-ip - Requires both API key and IP match
86
+ # open - No authentication (development only, NOT for production)
87
+ #
88
+ `;
89
+ await writeFile(this.configPath, header + yamlContent, 'utf-8');
90
+ }
91
+ /**
92
+ * Create a new configuration with specified options
93
+ */
94
+ async create(options) {
95
+ const config = {
96
+ ...DEFAULT_CONFIG,
97
+ api: {
98
+ access_mode: options.accessMode,
99
+ port: options.apiPort ?? DEFAULT_CONFIG.api.port,
100
+ api_key: options.apiKey ?? null,
101
+ allowed_ips: options.allowedIps ?? [],
102
+ },
103
+ console: {
104
+ enabled: options.consoleEnabled ?? DEFAULT_CONFIG.console.enabled,
105
+ port: options.consolePort ?? DEFAULT_CONFIG.console.port,
106
+ },
107
+ initialized_at: new Date().toISOString(),
108
+ };
109
+ await this.save(config);
110
+ return config;
111
+ }
112
+ /**
113
+ * Generate a new API key with mctk_ prefix
114
+ */
115
+ static generateApiKey() {
116
+ // Generate 32 bytes of random data and encode as base64url
117
+ const randomPart = randomBytes(32)
118
+ .toString('base64url')
119
+ .replace(/[^a-zA-Z0-9]/g, '')
120
+ .substring(0, 40);
121
+ return `mctk_${randomPart}`;
122
+ }
123
+ /**
124
+ * Validate an API key format
125
+ */
126
+ static isValidApiKey(key) {
127
+ return /^mctk_[a-zA-Z0-9]{20,}$/.test(key);
128
+ }
129
+ }
130
+ //# sourceMappingURL=admin-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"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"}