craftclose 0.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.
- package/LICENSE +21 -0
- package/README.md +176 -0
- package/SKILL.md +139 -0
- package/craftclose.example.yml +84 -0
- package/dist/ai-analyzer.d.ts +96 -0
- package/dist/ai-analyzer.d.ts.map +1 -0
- package/dist/ai-analyzer.js +275 -0
- package/dist/ai-analyzer.js.map +1 -0
- package/dist/alerts/discord.d.ts +23 -0
- package/dist/alerts/discord.d.ts.map +1 -0
- package/dist/alerts/discord.js +95 -0
- package/dist/alerts/discord.js.map +1 -0
- package/dist/alerts/index.d.ts +5 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +8 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/telegram.d.ts +25 -0
- package/dist/alerts/telegram.d.ts.map +1 -0
- package/dist/alerts/telegram.js +72 -0
- package/dist/alerts/telegram.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +410 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/connectors/index.d.ts +8 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +14 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/parsers.d.ts +24 -0
- package/dist/connectors/parsers.d.ts.map +1 -0
- package/dist/connectors/parsers.js +64 -0
- package/dist/connectors/parsers.js.map +1 -0
- package/dist/connectors/pterodactyl.d.ts +90 -0
- package/dist/connectors/pterodactyl.d.ts.map +1 -0
- package/dist/connectors/pterodactyl.js +221 -0
- package/dist/connectors/pterodactyl.js.map +1 -0
- package/dist/connectors/rcon.d.ts +51 -0
- package/dist/connectors/rcon.d.ts.map +1 -0
- package/dist/connectors/rcon.js +95 -0
- package/dist/connectors/rcon.js.map +1 -0
- package/dist/connectors/ssh.d.ts +65 -0
- package/dist/connectors/ssh.d.ts.map +1 -0
- package/dist/connectors/ssh.js +273 -0
- package/dist/connectors/ssh.js.map +1 -0
- package/dist/craft-close-skill.d.ts +106 -0
- package/dist/craft-close-skill.d.ts.map +1 -0
- package/dist/craft-close-skill.js +604 -0
- package/dist/craft-close-skill.js.map +1 -0
- package/dist/history.d.ts +32 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +194 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/openclaw-entry.d.ts +29 -0
- package/dist/openclaw-entry.d.ts.map +1 -0
- package/dist/openclaw-entry.js +45 -0
- package/dist/openclaw-entry.js.map +1 -0
- package/dist/patterns/index.d.ts +32 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +248 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/security/action-allowlist.d.ts +21 -0
- package/dist/security/action-allowlist.d.ts.map +1 -0
- package/dist/security/action-allowlist.js +54 -0
- package/dist/security/action-allowlist.js.map +1 -0
- package/dist/security/audit-log.d.ts +22 -0
- package/dist/security/audit-log.d.ts.map +1 -0
- package/dist/security/audit-log.js +49 -0
- package/dist/security/audit-log.js.map +1 -0
- package/dist/security/index.d.ts +10 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +20 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-sanitizer.d.ts +32 -0
- package/dist/security/input-sanitizer.d.ts.map +1 -0
- package/dist/security/input-sanitizer.js +81 -0
- package/dist/security/input-sanitizer.js.map +1 -0
- package/dist/security/path-jail.d.ts +25 -0
- package/dist/security/path-jail.d.ts.map +1 -0
- package/dist/security/path-jail.js +73 -0
- package/dist/security/path-jail.js.map +1 -0
- package/dist/security/rcon-filter.d.ts +24 -0
- package/dist/security/rcon-filter.d.ts.map +1 -0
- package/dist/security/rcon-filter.js +76 -0
- package/dist/security/rcon-filter.js.map +1 -0
- package/dist/types.d.ts +154 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CraftClose CLI — Simple command-line interface for server health checks.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const config_js_1 = require("./config.js");
|
|
10
|
+
const craft_close_skill_js_1 = require("./craft-close-skill.js");
|
|
11
|
+
const pterodactyl_js_1 = require("./connectors/pterodactyl.js");
|
|
12
|
+
const history_js_1 = require("./history.js");
|
|
13
|
+
const ai_analyzer_js_1 = require("./ai-analyzer.js");
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const command = args[0] ?? "status";
|
|
16
|
+
function printUsage() {
|
|
17
|
+
let version = "0.1.0";
|
|
18
|
+
try {
|
|
19
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, "../package.json"), "utf-8"));
|
|
20
|
+
version = pkg.version ?? version;
|
|
21
|
+
}
|
|
22
|
+
catch { /* ignore */ }
|
|
23
|
+
console.log(`craftclose v${version} — AI-powered Minecraft server monitoring`);
|
|
24
|
+
console.log("");
|
|
25
|
+
console.log("Usage: craftclose <command> [options]");
|
|
26
|
+
console.log("");
|
|
27
|
+
console.log("Commands:");
|
|
28
|
+
console.log(" status Check all servers once and print health");
|
|
29
|
+
console.log(" monitor Start continuous monitoring");
|
|
30
|
+
console.log(" test Test connectivity to all servers");
|
|
31
|
+
console.log(" history <server> [--limit=N] Show TPS/player history");
|
|
32
|
+
console.log(" analyze <logfile> AI crash log analysis");
|
|
33
|
+
console.log(" optimize <configdir> AI config optimization");
|
|
34
|
+
console.log(" conflicts <plugindir> AI plugin conflict detection");
|
|
35
|
+
console.log(" ptero-test Test Pterodactyl connections");
|
|
36
|
+
console.log(" ptero-console <server> <cmd> Send console command via panel");
|
|
37
|
+
console.log(" ptero-logs <server> [--lines=N] Read server logs via panel");
|
|
38
|
+
console.log(" ptero-files <server> [dir] List server files via panel");
|
|
39
|
+
console.log("");
|
|
40
|
+
console.log("Options:");
|
|
41
|
+
console.log(" --config=<path> Path to config file (default: ./craftclose.yml)");
|
|
42
|
+
console.log(" --help, -h Show this help message");
|
|
43
|
+
console.log(" --version, -v Print version number");
|
|
44
|
+
console.log("");
|
|
45
|
+
console.log("Docs: https://github.com/LaunchDay-Studio-Inc/craftclose");
|
|
46
|
+
}
|
|
47
|
+
function getConfigPath() {
|
|
48
|
+
const flag = args.find(a => a.startsWith("--config="));
|
|
49
|
+
return flag?.split("=")[1];
|
|
50
|
+
}
|
|
51
|
+
function printServerResult(r) {
|
|
52
|
+
console.log("");
|
|
53
|
+
console.log(`━━━ ${r.server} ━━━`);
|
|
54
|
+
console.log(`Status: ${r.online ? "🟢 ONLINE" : "🔴 OFFLINE"}`);
|
|
55
|
+
if (r.error)
|
|
56
|
+
console.log(`Error: ${r.error}`);
|
|
57
|
+
if (r.version)
|
|
58
|
+
console.log(`Version: ${r.version}`);
|
|
59
|
+
if (r.cpu !== undefined)
|
|
60
|
+
console.log(`CPU: ${r.cpu.toFixed(1)}%`);
|
|
61
|
+
if (r.ram)
|
|
62
|
+
console.log(`RAM: ${r.ram.used}MB / ${r.ram.total}MB (${r.ram.percent.toFixed(1)}%)`);
|
|
63
|
+
if (r.disk)
|
|
64
|
+
console.log(`Disk: ${r.disk.used}MB / ${r.disk.total}MB (${r.disk.percent.toFixed(1)}%)`);
|
|
65
|
+
if (r.tps !== undefined)
|
|
66
|
+
console.log(`TPS: ${r.tps.toFixed(1)} / 20.0`);
|
|
67
|
+
if (r.players) {
|
|
68
|
+
const names = r.players.list?.length ? ` — ${r.players.list.join(", ")}` : "";
|
|
69
|
+
console.log(`Players: ${r.players.online}/${r.players.max}${names}`);
|
|
70
|
+
}
|
|
71
|
+
if (r.uptime)
|
|
72
|
+
console.log(`Uptime: ${r.uptime}`);
|
|
73
|
+
}
|
|
74
|
+
function showHistory() {
|
|
75
|
+
const serverName = args[1];
|
|
76
|
+
if (!serverName) {
|
|
77
|
+
console.log("Usage: craftclose history <server-name> [--limit=N]");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const limitFlag = args.find(a => a.startsWith("--limit="));
|
|
81
|
+
const limit = limitFlag ? Number.parseInt(limitFlag.split("=")[1], 10) : 20;
|
|
82
|
+
const tracker = new history_js_1.HistoryTracker("./craftclose.db");
|
|
83
|
+
const history = tracker.getHistory(serverName, limit);
|
|
84
|
+
if (history.length === 0) {
|
|
85
|
+
console.log(`No history for ${serverName}. Run 'craftclose monitor' first.`);
|
|
86
|
+
tracker.close();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
console.log(`\n━━━ ${serverName} — Last ${history.length} checks ━━━\n`);
|
|
90
|
+
const ordered = [...history].reverse();
|
|
91
|
+
for (const h of ordered) {
|
|
92
|
+
const time = h.timestamp.toLocaleTimeString("en-US", { hour12: false });
|
|
93
|
+
const status = h.online ? "🟢" : "🔴";
|
|
94
|
+
const tps = h.tps === undefined ? "" : `TPS:${h.tps.toFixed(1)}`;
|
|
95
|
+
const players = h.players ? `Players:${h.players.online}/${h.players.max}` : "";
|
|
96
|
+
const cpu = h.cpu === undefined ? "" : `CPU:${h.cpu.toFixed(0)}%`;
|
|
97
|
+
console.log(`${time} ${status} ${tps} ${players} ${cpu}`.trim());
|
|
98
|
+
}
|
|
99
|
+
const avgTps = tracker.getAverageTps(serverName);
|
|
100
|
+
if (avgTps !== null) {
|
|
101
|
+
console.log(`\nAvg TPS (last 10): ${avgTps.toFixed(1)}`);
|
|
102
|
+
}
|
|
103
|
+
tracker.close();
|
|
104
|
+
}
|
|
105
|
+
async function runStatus(skill) {
|
|
106
|
+
const results = await skill.checkAllServers();
|
|
107
|
+
for (const r of results) {
|
|
108
|
+
printServerResult(r);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function runTest(skill, config) {
|
|
112
|
+
console.log("[CraftClose] Testing connectivity...");
|
|
113
|
+
for (const server of config.servers) {
|
|
114
|
+
console.log(`\nTesting ${server.name}...`);
|
|
115
|
+
try {
|
|
116
|
+
const result = await skill.checkServer(server.name);
|
|
117
|
+
console.log(` ✅ ${server.name}: ${result.online ? "Online" : "Offline"}`);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
121
|
+
console.log(` ❌ ${server.name}: ${message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function requireAiAnalyzer(config) {
|
|
126
|
+
if (!config.ai?.gemini_key) {
|
|
127
|
+
console.error("[CraftClose] Set ai.gemini_key in craftclose.yml to use AI features.");
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return new ai_analyzer_js_1.AIAnalyzer({
|
|
131
|
+
geminiKey: config.ai.gemini_key,
|
|
132
|
+
model: config.ai.model,
|
|
133
|
+
maxCallsPerHour: config.ai.max_calls_per_hour,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async function runAnalyze(config) {
|
|
137
|
+
const logFile = args[1];
|
|
138
|
+
if (!logFile) {
|
|
139
|
+
console.log("Usage: craftclose analyze <logfile>");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const analyzer = requireAiAnalyzer(config);
|
|
143
|
+
if (!analyzer)
|
|
144
|
+
return;
|
|
145
|
+
const log = (0, node_fs_1.readFileSync)(logFile, "utf-8");
|
|
146
|
+
console.log(`[CraftClose] Analyzing ${logFile} (${log.split("\n").length} lines)...`);
|
|
147
|
+
const result = await analyzer.analyzeCrash({ log: log.slice(-8000), context: {} });
|
|
148
|
+
if (!result) {
|
|
149
|
+
console.log("AI analysis unavailable (rate-limited or error). Try again later.");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
console.log("");
|
|
153
|
+
console.log(`🤖 AI Analysis (confidence: ${result.confidence}%)`);
|
|
154
|
+
console.log(`Severity: ${result.severity}`);
|
|
155
|
+
console.log(`Root cause: ${result.root_cause}`);
|
|
156
|
+
console.log(`Fix: ${result.fix_suggestion}`);
|
|
157
|
+
console.log(`Model: ${result.model}${result.cached ? " (cached)" : ""}`);
|
|
158
|
+
}
|
|
159
|
+
async function runOptimize(config) {
|
|
160
|
+
const configDir = args[1];
|
|
161
|
+
if (!configDir) {
|
|
162
|
+
console.log("Usage: craftclose optimize <configdir>");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const analyzer = requireAiAnalyzer(config);
|
|
166
|
+
if (!analyzer)
|
|
167
|
+
return;
|
|
168
|
+
const configFiles = ["server.properties", "bukkit.yml", "spigot.yml", "paper-global.yml", "paper-world-defaults.yml", "purpur.yml"];
|
|
169
|
+
const configs = {};
|
|
170
|
+
for (const file of configFiles) {
|
|
171
|
+
try {
|
|
172
|
+
configs[file] = (0, node_fs_1.readFileSync)((0, node_path_1.join)(configDir, file), "utf-8");
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// File doesn't exist — skip
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (Object.keys(configs).length === 0) {
|
|
179
|
+
console.log(`No config files found in ${configDir}. Looking for: ${configFiles.join(", ")}`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
console.log(`[CraftClose] Optimizing ${Object.keys(configs).length} config file(s)...`);
|
|
183
|
+
const result = await analyzer.optimizeConfig({
|
|
184
|
+
configs,
|
|
185
|
+
ram_mb: 4096,
|
|
186
|
+
player_target: 20,
|
|
187
|
+
server_type: "paper",
|
|
188
|
+
});
|
|
189
|
+
if (!result) {
|
|
190
|
+
console.log("AI optimization unavailable (rate-limited or error). Try again later.");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (result.length === 0) {
|
|
194
|
+
console.log("✅ No optimization recommendations — your config looks good!");
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
console.log(`\n🔧 ${result.length} Recommendation(s):\n`);
|
|
198
|
+
for (const rec of result) {
|
|
199
|
+
console.log(`[${rec.risk.toUpperCase()}] ${rec.file} → ${rec.setting}`);
|
|
200
|
+
console.log(` Current: ${rec.current_value}`);
|
|
201
|
+
console.log(` Recommended: ${rec.recommended_value}`);
|
|
202
|
+
console.log(` Reason: ${rec.reason}`);
|
|
203
|
+
console.log("");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function runConflicts(config) {
|
|
207
|
+
const pluginDir = args[1];
|
|
208
|
+
if (!pluginDir) {
|
|
209
|
+
console.log("Usage: craftclose conflicts <plugindir>");
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const analyzer = requireAiAnalyzer(config);
|
|
213
|
+
if (!analyzer)
|
|
214
|
+
return;
|
|
215
|
+
const jars = (0, node_fs_1.readdirSync)(pluginDir).filter(f => f.endsWith(".jar"));
|
|
216
|
+
if (jars.length === 0) {
|
|
217
|
+
console.log(`No jar files found in ${pluginDir}.`);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const plugins = jars.map(jar => {
|
|
221
|
+
const name = (0, node_path_1.basename)(jar, ".jar");
|
|
222
|
+
const match = /^(.+?)[-_]v?(\d+[\d.]*\S*)$/u.exec(name);
|
|
223
|
+
return match
|
|
224
|
+
? { name: match[1], version: match[2] }
|
|
225
|
+
: { name, version: "unknown" };
|
|
226
|
+
});
|
|
227
|
+
console.log(`[CraftClose] Checking ${plugins.length} plugin(s) for conflicts...`);
|
|
228
|
+
const result = await analyzer.detectConflicts({ plugins });
|
|
229
|
+
if (!result) {
|
|
230
|
+
console.log("AI conflict detection unavailable (rate-limited or error). Try again later.");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (result.length === 0) {
|
|
234
|
+
console.log("✅ No plugin conflicts detected!");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
console.log(`\n⚠️ ${result.length} Conflict(s) Found:\n`);
|
|
238
|
+
for (const conflict of result) {
|
|
239
|
+
const tag = conflict.type === "known" ? "KNOWN" : "SUSPECTED";
|
|
240
|
+
console.log(`[${tag}] ${conflict.plugins.join(" + ")}`);
|
|
241
|
+
console.log(` ${conflict.description}`);
|
|
242
|
+
console.log(` Fix: ${conflict.resolution}`);
|
|
243
|
+
console.log("");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function runPteroTest(config) {
|
|
247
|
+
console.log("Testing Pterodactyl connections...\n");
|
|
248
|
+
const pteroServers = config.servers.filter(s => s.pterodactyl);
|
|
249
|
+
if (pteroServers.length === 0) {
|
|
250
|
+
console.log("No servers with Pterodactyl config found.");
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
for (const server of pteroServers) {
|
|
254
|
+
const ptero = new pterodactyl_js_1.PterodactylConnector({ serverName: server.name, config: server.pterodactyl });
|
|
255
|
+
const ok = await ptero.testConnection();
|
|
256
|
+
if (ok) {
|
|
257
|
+
console.log(` ✅ ${server.name}: Connected`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.log(` ❌ ${server.name}: Connection failed (check panel_url, api_key, server_id)`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async function runPteroConsole(config) {
|
|
265
|
+
const serverName = args[1];
|
|
266
|
+
const cmd = args[2];
|
|
267
|
+
if (!serverName || !cmd) {
|
|
268
|
+
console.log("Usage: craftclose ptero-console <server> <command>");
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const server = config.servers.find(s => s.name === serverName);
|
|
272
|
+
if (!server?.pterodactyl) {
|
|
273
|
+
console.log(`Server '${serverName}' not found or has no Pterodactyl config.`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const ptero = new pterodactyl_js_1.PterodactylConnector({ serverName, config: server.pterodactyl });
|
|
277
|
+
await ptero.sendCommand(cmd);
|
|
278
|
+
console.log(`[CraftClose] Sent command to ${serverName}: ${cmd}`);
|
|
279
|
+
}
|
|
280
|
+
async function runPteroLogs(config) {
|
|
281
|
+
const serverName = args[1];
|
|
282
|
+
if (!serverName) {
|
|
283
|
+
console.log("Usage: craftclose ptero-logs <server> [--lines=N]");
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const server = config.servers.find(s => s.name === serverName);
|
|
287
|
+
if (!server?.pterodactyl) {
|
|
288
|
+
console.log(`Server '${serverName}' not found or has no Pterodactyl config.`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const linesFlag = args.find(a => a.startsWith("--lines="));
|
|
292
|
+
const lines = linesFlag ? Number.parseInt(linesFlag.split("=")[1], 10) : 100;
|
|
293
|
+
const ptero = new pterodactyl_js_1.PterodactylConnector({ serverName, config: server.pterodactyl });
|
|
294
|
+
const content = await ptero.readFile("/logs/latest.log");
|
|
295
|
+
const allLines = content.split("\n");
|
|
296
|
+
const output = allLines.slice(-lines).join("\n");
|
|
297
|
+
console.log(output);
|
|
298
|
+
}
|
|
299
|
+
async function runPteroFiles(config) {
|
|
300
|
+
const serverName = args[1];
|
|
301
|
+
if (!serverName) {
|
|
302
|
+
console.log("Usage: craftclose ptero-files <server> [directory]");
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const server = config.servers.find(s => s.name === serverName);
|
|
306
|
+
if (!server?.pterodactyl) {
|
|
307
|
+
console.log(`Server '${serverName}' not found or has no Pterodactyl config.`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const directory = args[2] ?? "/";
|
|
311
|
+
const ptero = new pterodactyl_js_1.PterodactylConnector({ serverName, config: server.pterodactyl });
|
|
312
|
+
const files = await ptero.listFiles(directory);
|
|
313
|
+
console.log(`\n${serverName} — ${directory}\n`);
|
|
314
|
+
for (const f of files) {
|
|
315
|
+
const icon = f.is_file ? "📄" : "📁";
|
|
316
|
+
const size = f.is_file ? ` (${formatSize(f.size)})` : "";
|
|
317
|
+
console.log(` ${icon} ${f.name}${size}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
function formatSize(bytes) {
|
|
321
|
+
if (bytes < 1024)
|
|
322
|
+
return `${bytes}B`;
|
|
323
|
+
if (bytes < 1024 * 1024)
|
|
324
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
325
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
326
|
+
return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
|
|
327
|
+
return `${(bytes / 1024 / 1024 / 1024).toFixed(1)}GB`;
|
|
328
|
+
}
|
|
329
|
+
async function main() {
|
|
330
|
+
if (command === "--help" || command === "-h" || command === "help") {
|
|
331
|
+
printUsage();
|
|
332
|
+
process.exit(0);
|
|
333
|
+
}
|
|
334
|
+
if (command === "--version" || command === "-v") {
|
|
335
|
+
let version = "0.1.0";
|
|
336
|
+
try {
|
|
337
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, "../package.json"), "utf-8"));
|
|
338
|
+
version = pkg.version ?? version;
|
|
339
|
+
}
|
|
340
|
+
catch { /* ignore */ }
|
|
341
|
+
console.log(`craftclose v${version}`);
|
|
342
|
+
process.exit(0);
|
|
343
|
+
}
|
|
344
|
+
let config;
|
|
345
|
+
try {
|
|
346
|
+
config = (0, config_js_1.loadConfig)(getConfigPath());
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
350
|
+
if (message.includes("ENOENT") || message.includes("not found") || message.includes("No craftclose.yml")) {
|
|
351
|
+
console.error("[CraftClose] Config file not found.");
|
|
352
|
+
console.error("");
|
|
353
|
+
console.error(" Quick start:");
|
|
354
|
+
console.error(" 1. cp craftclose.example.yml craftclose.yml");
|
|
355
|
+
console.error(" 2. Edit craftclose.yml with your server details");
|
|
356
|
+
console.error(" 3. Run: craftclose test");
|
|
357
|
+
console.error("");
|
|
358
|
+
console.error(" Or specify a config: craftclose status --config=/path/to/config.yml");
|
|
359
|
+
process.exit(1);
|
|
360
|
+
}
|
|
361
|
+
throw err;
|
|
362
|
+
}
|
|
363
|
+
const skill = new craft_close_skill_js_1.CraftCloseSkill(config);
|
|
364
|
+
switch (command) {
|
|
365
|
+
case "status":
|
|
366
|
+
await runStatus(skill);
|
|
367
|
+
break;
|
|
368
|
+
case "monitor":
|
|
369
|
+
console.log("[CraftClose] Starting continuous monitoring...");
|
|
370
|
+
await skill.start();
|
|
371
|
+
process.on("SIGINT", () => { skill.stop(); process.exit(0); });
|
|
372
|
+
process.on("SIGTERM", () => { skill.stop(); process.exit(0); });
|
|
373
|
+
break;
|
|
374
|
+
case "test":
|
|
375
|
+
await runTest(skill, config);
|
|
376
|
+
break;
|
|
377
|
+
case "history":
|
|
378
|
+
showHistory();
|
|
379
|
+
break;
|
|
380
|
+
case "analyze":
|
|
381
|
+
await runAnalyze(config);
|
|
382
|
+
break;
|
|
383
|
+
case "optimize":
|
|
384
|
+
await runOptimize(config);
|
|
385
|
+
break;
|
|
386
|
+
case "conflicts":
|
|
387
|
+
await runConflicts(config);
|
|
388
|
+
break;
|
|
389
|
+
case "ptero-test":
|
|
390
|
+
await runPteroTest(config);
|
|
391
|
+
break;
|
|
392
|
+
case "ptero-console":
|
|
393
|
+
await runPteroConsole(config);
|
|
394
|
+
break;
|
|
395
|
+
case "ptero-logs":
|
|
396
|
+
await runPteroLogs(config);
|
|
397
|
+
break;
|
|
398
|
+
case "ptero-files":
|
|
399
|
+
await runPteroFiles(config);
|
|
400
|
+
break;
|
|
401
|
+
default:
|
|
402
|
+
printUsage();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
main().catch((err) => {
|
|
406
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
407
|
+
console.error("[CraftClose] Fatal:", message);
|
|
408
|
+
process.exit(1);
|
|
409
|
+
});
|
|
410
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config loader — Reads craftclose.yml and returns typed config.
|
|
3
|
+
*/
|
|
4
|
+
import type { CraftCloseConfig } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Load CraftClose config from a YAML file.
|
|
7
|
+
* Searches: provided path → ./craftclose.yml → ~/.craftclose/config.yml
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadConfig(configPath?: string): CraftCloseConfig;
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAyBhE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config loader — Reads craftclose.yml and returns typed config.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadConfig = loadConfig;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const yaml_1 = require("yaml");
|
|
9
|
+
/**
|
|
10
|
+
* Load CraftClose config from a YAML file.
|
|
11
|
+
* Searches: provided path → ./craftclose.yml → ~/.craftclose/config.yml
|
|
12
|
+
*/
|
|
13
|
+
function loadConfig(configPath) {
|
|
14
|
+
const paths = configPath
|
|
15
|
+
? [configPath]
|
|
16
|
+
: ["./craftclose.yml", `${process.env.HOME}/.craftclose/config.yml`];
|
|
17
|
+
for (const p of paths) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = (0, node_fs_1.readFileSync)(p, "utf-8");
|
|
20
|
+
const parsed = (0, yaml_1.parse)(raw);
|
|
21
|
+
if (!parsed.servers || parsed.servers.length === 0) {
|
|
22
|
+
throw new Error("Config must define at least one server");
|
|
23
|
+
}
|
|
24
|
+
console.log(`[CraftClose] Loaded config from ${p} (${parsed.servers.length} server(s))`);
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof Error && "code" in err && err.code === "ENOENT") {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new Error("No craftclose.yml found. Create one — see README.md for example config.");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,gCAyBC;AAjCD,qCAAuC;AACvC,+BAA6B;AAG7B;;;GAGG;AACH,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC,CAAC,UAAU,CAAC;QACd,CAAC,CAAC,CAAC,kBAAkB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;IAEvE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAA,YAAK,EAAC,GAAG,CAAqB,CAAC;YAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;YACzF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9F,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { SshConnector } from "./ssh.js";
|
|
2
|
+
export type { SshConnectorOptions } from "./ssh.js";
|
|
3
|
+
export { RconConnector } from "./rcon.js";
|
|
4
|
+
export type { RconConnectorOptions } from "./rcon.js";
|
|
5
|
+
export { PterodactylConnector } from "./pterodactyl.js";
|
|
6
|
+
export type { PterodactylConnectorOptions, PteroResourceUsage, PteroFileEntry } from "./pterodactyl.js";
|
|
7
|
+
export { stripColorCodes, parseTpsResponse, parsePlayersResponse } from "./parsers.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePlayersResponse = exports.parseTpsResponse = exports.stripColorCodes = exports.PterodactylConnector = exports.RconConnector = exports.SshConnector = void 0;
|
|
4
|
+
var ssh_js_1 = require("./ssh.js");
|
|
5
|
+
Object.defineProperty(exports, "SshConnector", { enumerable: true, get: function () { return ssh_js_1.SshConnector; } });
|
|
6
|
+
var rcon_js_1 = require("./rcon.js");
|
|
7
|
+
Object.defineProperty(exports, "RconConnector", { enumerable: true, get: function () { return rcon_js_1.RconConnector; } });
|
|
8
|
+
var pterodactyl_js_1 = require("./pterodactyl.js");
|
|
9
|
+
Object.defineProperty(exports, "PterodactylConnector", { enumerable: true, get: function () { return pterodactyl_js_1.PterodactylConnector; } });
|
|
10
|
+
var parsers_js_1 = require("./parsers.js");
|
|
11
|
+
Object.defineProperty(exports, "stripColorCodes", { enumerable: true, get: function () { return parsers_js_1.stripColorCodes; } });
|
|
12
|
+
Object.defineProperty(exports, "parseTpsResponse", { enumerable: true, get: function () { return parsers_js_1.parseTpsResponse; } });
|
|
13
|
+
Object.defineProperty(exports, "parsePlayersResponse", { enumerable: true, get: function () { return parsers_js_1.parsePlayersResponse; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAErB,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AAEtB,mDAAwD;AAA/C,sHAAA,oBAAoB,OAAA;AAE7B,2CAAuF;AAA9E,6GAAA,eAAe,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAAE,kHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared parsing functions for Minecraft server responses.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions — no I/O, no side effects. Used by both RconConnector and Docker exec fallback.
|
|
5
|
+
*/
|
|
6
|
+
/** Strip Minecraft color codes (§X) from a string */
|
|
7
|
+
export declare function stripColorCodes(text: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Parse TPS from a server response string.
|
|
10
|
+
* Handles Paper/Spigot format: "TPS from last 1m, 5m, 15m: *20.0, *19.8, *19.5"
|
|
11
|
+
* Returns the 1-minute TPS value, or null if unparseable.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseTpsResponse(response: string): number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Parse player list from a server response.
|
|
16
|
+
* Handles: "There are X of a max of Y players online: name1, name2"
|
|
17
|
+
* Also handles: "X/Y players online"
|
|
18
|
+
*/
|
|
19
|
+
export declare function parsePlayersResponse(response: string): {
|
|
20
|
+
online: number;
|
|
21
|
+
max: number;
|
|
22
|
+
list: string[];
|
|
23
|
+
} | null;
|
|
24
|
+
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/connectors/parsers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAsB7G"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared parsing functions for Minecraft server responses.
|
|
4
|
+
*
|
|
5
|
+
* Pure functions — no I/O, no side effects. Used by both RconConnector and Docker exec fallback.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.stripColorCodes = stripColorCodes;
|
|
9
|
+
exports.parseTpsResponse = parseTpsResponse;
|
|
10
|
+
exports.parsePlayersResponse = parsePlayersResponse;
|
|
11
|
+
/** Strip Minecraft color codes (§X) from a string */
|
|
12
|
+
function stripColorCodes(text) {
|
|
13
|
+
return text.replaceAll(/§[0-9a-fk-or]/gi, "");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse TPS from a server response string.
|
|
17
|
+
* Handles Paper/Spigot format: "TPS from last 1m, 5m, 15m: *20.0, *19.8, *19.5"
|
|
18
|
+
* Returns the 1-minute TPS value, or null if unparseable.
|
|
19
|
+
*/
|
|
20
|
+
function parseTpsResponse(response) {
|
|
21
|
+
const clean = stripColorCodes(response);
|
|
22
|
+
// Paper/Spigot format — extract first number after the colon
|
|
23
|
+
const match = /:\s*\*?([\d.]+)/.exec(clean);
|
|
24
|
+
if (match) {
|
|
25
|
+
const tps = Number.parseFloat(match[1]);
|
|
26
|
+
if (!Number.isNaN(tps)) {
|
|
27
|
+
return tps;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Fallback: find the first float-like number in range
|
|
31
|
+
const fallback = /(\d+\.\d+)/.exec(clean);
|
|
32
|
+
if (fallback) {
|
|
33
|
+
const tps = Number.parseFloat(fallback[1]);
|
|
34
|
+
if (!Number.isNaN(tps) && tps >= 0 && tps <= 20) {
|
|
35
|
+
return tps;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse player list from a server response.
|
|
42
|
+
* Handles: "There are X of a max of Y players online: name1, name2"
|
|
43
|
+
* Also handles: "X/Y players online"
|
|
44
|
+
*/
|
|
45
|
+
function parsePlayersResponse(response) {
|
|
46
|
+
const clean = stripColorCodes(response);
|
|
47
|
+
const match = /(\d+)\s+of\s+a\s+max\s+of\s+(\d+)/i.exec(clean)
|
|
48
|
+
?? /(\d+)\s*\/\s*(\d+)\s+players/i.exec(clean);
|
|
49
|
+
if (!match)
|
|
50
|
+
return null;
|
|
51
|
+
const online = Number.parseInt(match[1], 10);
|
|
52
|
+
const max = Number.parseInt(match[2], 10);
|
|
53
|
+
// Extract player names after the colon
|
|
54
|
+
const colonIndex = clean.indexOf(":");
|
|
55
|
+
let list = [];
|
|
56
|
+
if (colonIndex !== -1) {
|
|
57
|
+
const namesStr = clean.substring(colonIndex + 1).trim();
|
|
58
|
+
if (namesStr.length > 0) {
|
|
59
|
+
list = namesStr.split(",").map(n => n.trim()).filter(n => n.length > 0);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { online, max, list };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/connectors/parsers.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAGH,0CAEC;AAOD,4CAsBC;AAOD,oDAsBC;AA7DD,qDAAqD;AACrD,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAExC,6DAA6D;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;YAChD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC;WACzD,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1C,uCAAuC;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,GAAa,EAAE,CAAC;IACxB,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC"}
|