@minecraft-docker/mcctl 1.6.1 → 1.6.3

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 +515 -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 +392 -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 +87 -0
  75. package/dist/lib/pm2-utils.d.ts.map +1 -0
  76. package/dist/lib/pm2-utils.js +249 -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,392 @@
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's `only` option expects a string (comma-separated app names), not an array
49
+ pm2.start(configPath, { only: appName }, (err, proc) => {
50
+ if (err)
51
+ reject(err);
52
+ else
53
+ resolve(proc);
54
+ });
55
+ }
56
+ else {
57
+ // Start all apps from config
58
+ pm2.start(configPath, (err, proc) => {
59
+ if (err)
60
+ reject(err);
61
+ else
62
+ resolve(proc);
63
+ });
64
+ }
65
+ });
66
+ }
67
+ function pm2Stop(name) {
68
+ return new Promise((resolve, reject) => {
69
+ pm2.stop(name, (err, proc) => {
70
+ if (err)
71
+ reject(err);
72
+ else
73
+ resolve(proc);
74
+ });
75
+ });
76
+ }
77
+ function pm2Restart(name) {
78
+ return new Promise((resolve, reject) => {
79
+ pm2.restart(name, (err, proc) => {
80
+ if (err)
81
+ reject(err);
82
+ else
83
+ resolve(proc);
84
+ });
85
+ });
86
+ }
87
+ function pm2Delete(name) {
88
+ return new Promise((resolve, reject) => {
89
+ pm2.delete(name, (err, proc) => {
90
+ if (err)
91
+ reject(err);
92
+ else
93
+ resolve(proc);
94
+ });
95
+ });
96
+ }
97
+ function pm2Describe(name) {
98
+ return new Promise((resolve, reject) => {
99
+ pm2.describe(name, (err, desc) => {
100
+ if (err)
101
+ reject(err);
102
+ else
103
+ resolve(desc);
104
+ });
105
+ });
106
+ }
107
+ function pm2Flush(name) {
108
+ return new Promise((resolve, reject) => {
109
+ pm2.flush(name, (err) => {
110
+ if (err)
111
+ reject(err);
112
+ else
113
+ resolve();
114
+ });
115
+ });
116
+ }
117
+ function pm2Dump() {
118
+ return new Promise((resolve, reject) => {
119
+ pm2.dump((err) => {
120
+ if (err)
121
+ reject(err);
122
+ else
123
+ resolve();
124
+ });
125
+ });
126
+ }
127
+ /**
128
+ * PM2 Service Manager Adapter
129
+ * Implements IServiceManagerPort for managing services via PM2
130
+ */
131
+ export class Pm2ServiceManagerAdapter {
132
+ connected = false;
133
+ paths;
134
+ constructor(paths) {
135
+ this.paths = paths;
136
+ }
137
+ /**
138
+ * Ensure connected to PM2 daemon
139
+ */
140
+ async ensureConnected() {
141
+ if (!this.connected) {
142
+ await pm2Connect(false);
143
+ this.connected = true;
144
+ }
145
+ }
146
+ /**
147
+ * Disconnect from PM2 daemon
148
+ */
149
+ disconnect() {
150
+ if (this.connected) {
151
+ pm2.disconnect();
152
+ this.connected = false;
153
+ }
154
+ }
155
+ /**
156
+ * Wait for a service to become online
157
+ * @param name - Service name
158
+ * @param timeout - Timeout in milliseconds
159
+ */
160
+ async waitForOnline(name, timeout) {
161
+ const startTime = Date.now();
162
+ while (Date.now() - startTime < timeout) {
163
+ const procs = await pm2List();
164
+ const proc = procs.find((p) => p.name === name);
165
+ if (proc?.pm2_env?.status === 'online') {
166
+ return;
167
+ }
168
+ await new Promise((resolve) => setTimeout(resolve, 500));
169
+ }
170
+ throw new Error(`Timeout waiting for ${name} to be ready`);
171
+ }
172
+ /**
173
+ * Start a service by name
174
+ */
175
+ async start(name, options) {
176
+ try {
177
+ await this.ensureConnected();
178
+ // Check if already running
179
+ const processes = await pm2List();
180
+ const existing = processes.find((p) => p.name === name);
181
+ if (existing && existing.pm2_env?.status === 'online') {
182
+ // Already running, no action needed
183
+ return;
184
+ }
185
+ if (existing) {
186
+ // Process exists but stopped, restart it
187
+ await pm2Restart(name);
188
+ // Wait for ready if requested (same logic as new process start)
189
+ if (options?.wait) {
190
+ await this.waitForOnline(name, options.waitTimeout || 30000);
191
+ }
192
+ return;
193
+ }
194
+ // Start from ecosystem config
195
+ const configPath = getEcosystemConfigPath(this.paths);
196
+ if (!existsSync(configPath)) {
197
+ throw new Error(`Ecosystem config not found: ${configPath}. Run 'mcctl console init' first.`);
198
+ }
199
+ // Start the specific app from config (not all apps)
200
+ await pm2StartConfig(configPath, name);
201
+ // Wait for ready if requested
202
+ if (options?.wait) {
203
+ await this.waitForOnline(name, options.waitTimeout || 30000);
204
+ }
205
+ }
206
+ catch (error) {
207
+ throw new Error(`Failed to start ${name}: ${formatPm2Error(error)}`);
208
+ }
209
+ }
210
+ /**
211
+ * Stop a service by name
212
+ * @throws Error if service not found (as per IServiceManagerPort contract)
213
+ */
214
+ async stop(name, options) {
215
+ try {
216
+ await this.ensureConnected();
217
+ // Check if process exists - throw if not found (interface contract)
218
+ const exists = await this.exists(name);
219
+ if (!exists) {
220
+ throw new Error(`Service '${name}' not found`);
221
+ }
222
+ if (options?.force) {
223
+ // Force stop: delete the process
224
+ await pm2Delete(name);
225
+ }
226
+ else {
227
+ // Graceful stop
228
+ await pm2Stop(name);
229
+ }
230
+ }
231
+ catch (error) {
232
+ throw new Error(`Failed to stop ${name}: ${formatPm2Error(error)}`);
233
+ }
234
+ }
235
+ /**
236
+ * Restart a service by name
237
+ */
238
+ async restart(name, options) {
239
+ try {
240
+ await this.ensureConnected();
241
+ // Check if process exists
242
+ const exists = await this.exists(name);
243
+ if (!exists) {
244
+ // Not running, start instead
245
+ await this.start(name, options);
246
+ return;
247
+ }
248
+ await pm2Restart(name);
249
+ // Wait for ready if requested
250
+ if (options?.wait) {
251
+ await this.waitForOnline(name, options.waitTimeout || 30000);
252
+ }
253
+ }
254
+ catch (error) {
255
+ throw new Error(`Failed to restart ${name}: ${formatPm2Error(error)}`);
256
+ }
257
+ }
258
+ /**
259
+ * Get status of one or all services
260
+ */
261
+ async status(name) {
262
+ try {
263
+ await this.ensureConnected();
264
+ let processes;
265
+ if (name) {
266
+ try {
267
+ processes = await pm2Describe(name);
268
+ }
269
+ catch {
270
+ // Process not found
271
+ return [];
272
+ }
273
+ }
274
+ else {
275
+ processes = await pm2List();
276
+ // Filter to only our services
277
+ processes = processes.filter((p) => p.name === PM2_SERVICE_NAMES.API || p.name === PM2_SERVICE_NAMES.CONSOLE);
278
+ }
279
+ return processes.map((p) => ProcessInfo.create({
280
+ pmId: p.pm_id ?? 0,
281
+ name: p.name ?? 'unknown',
282
+ status: normalizePm2Status(p.pm2_env?.status ?? 'stopped'),
283
+ pid: p.pid,
284
+ cpu: p.monit?.cpu,
285
+ memory: p.monit?.memory,
286
+ uptime: p.pm2_env?.pm_uptime,
287
+ restarts: p.pm2_env?.restart_time,
288
+ interpreter: p.pm2_env?.exec_interpreter,
289
+ scriptPath: p.pm2_env?.pm_exec_path,
290
+ }));
291
+ }
292
+ catch (error) {
293
+ throw new Error(`Failed to get status: ${formatPm2Error(error)}`);
294
+ }
295
+ }
296
+ /**
297
+ * Get logs for a service
298
+ */
299
+ async logs(name, options) {
300
+ const logPaths = getPm2LogPaths(this.paths, name);
301
+ const lines = options?.lines ?? 100;
302
+ if (options?.err) {
303
+ return readLogFile(logPaths.error, lines);
304
+ }
305
+ // Return combined logs
306
+ const outLogs = readLogFile(logPaths.output, lines);
307
+ const errLogs = readLogFile(logPaths.error, lines);
308
+ if (outLogs && errLogs) {
309
+ return `=== stdout ===\n${outLogs}\n\n=== stderr ===\n${errLogs}`;
310
+ }
311
+ return outLogs || errLogs || 'No logs available';
312
+ }
313
+ /**
314
+ * Delete a service from PM2
315
+ */
316
+ async delete(name) {
317
+ try {
318
+ await this.ensureConnected();
319
+ const exists = await this.exists(name);
320
+ if (!exists) {
321
+ return;
322
+ }
323
+ await pm2Delete(name);
324
+ }
325
+ catch (error) {
326
+ throw new Error(`Failed to delete ${name}: ${formatPm2Error(error)}`);
327
+ }
328
+ }
329
+ /**
330
+ * Reload ecosystem configuration
331
+ */
332
+ async reload(configPath) {
333
+ try {
334
+ await this.ensureConnected();
335
+ if (!existsSync(configPath)) {
336
+ throw new Error(`Config file not found: ${configPath}`);
337
+ }
338
+ // Reload by restarting from config
339
+ await pm2StartConfig(configPath);
340
+ }
341
+ catch (error) {
342
+ throw new Error(`Failed to reload config: ${formatPm2Error(error)}`);
343
+ }
344
+ }
345
+ /**
346
+ * Check if a service exists in PM2
347
+ */
348
+ async exists(name) {
349
+ try {
350
+ await this.ensureConnected();
351
+ const processes = await pm2List();
352
+ return processes.some((p) => p.name === name);
353
+ }
354
+ catch {
355
+ return false;
356
+ }
357
+ }
358
+ /**
359
+ * Flush logs for a service
360
+ */
361
+ async flush(name) {
362
+ try {
363
+ await this.ensureConnected();
364
+ await pm2Flush(name);
365
+ }
366
+ catch (error) {
367
+ throw new Error(`Failed to flush logs for ${name}: ${formatPm2Error(error)}`);
368
+ }
369
+ }
370
+ /**
371
+ * Save current process list
372
+ */
373
+ async save() {
374
+ try {
375
+ await this.ensureConnected();
376
+ await pm2Dump();
377
+ }
378
+ catch (error) {
379
+ throw new Error(`Failed to save process list: ${formatPm2Error(error)}`);
380
+ }
381
+ }
382
+ /**
383
+ * Resurrect saved processes
384
+ * Note: This is typically done via 'pm2 resurrect' command
385
+ */
386
+ async resurrect() {
387
+ // PM2 doesn't have a direct API for resurrect
388
+ // It's typically done via CLI: pm2 resurrect
389
+ throw new Error('Resurrect is not supported via API. Use: pm2 resurrect');
390
+ }
391
+ }
392
+ //# 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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"}