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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/SKILL.md +139 -0
  4. package/craftclose.example.yml +84 -0
  5. package/dist/ai-analyzer.d.ts +96 -0
  6. package/dist/ai-analyzer.d.ts.map +1 -0
  7. package/dist/ai-analyzer.js +275 -0
  8. package/dist/ai-analyzer.js.map +1 -0
  9. package/dist/alerts/discord.d.ts +23 -0
  10. package/dist/alerts/discord.d.ts.map +1 -0
  11. package/dist/alerts/discord.js +95 -0
  12. package/dist/alerts/discord.js.map +1 -0
  13. package/dist/alerts/index.d.ts +5 -0
  14. package/dist/alerts/index.d.ts.map +1 -0
  15. package/dist/alerts/index.js +8 -0
  16. package/dist/alerts/index.js.map +1 -0
  17. package/dist/alerts/telegram.d.ts +25 -0
  18. package/dist/alerts/telegram.d.ts.map +1 -0
  19. package/dist/alerts/telegram.js +72 -0
  20. package/dist/alerts/telegram.js.map +1 -0
  21. package/dist/cli.d.ts +6 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +410 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/config.d.ts +10 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +36 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/connectors/index.d.ts +8 -0
  30. package/dist/connectors/index.d.ts.map +1 -0
  31. package/dist/connectors/index.js +14 -0
  32. package/dist/connectors/index.js.map +1 -0
  33. package/dist/connectors/parsers.d.ts +24 -0
  34. package/dist/connectors/parsers.d.ts.map +1 -0
  35. package/dist/connectors/parsers.js +64 -0
  36. package/dist/connectors/parsers.js.map +1 -0
  37. package/dist/connectors/pterodactyl.d.ts +90 -0
  38. package/dist/connectors/pterodactyl.d.ts.map +1 -0
  39. package/dist/connectors/pterodactyl.js +221 -0
  40. package/dist/connectors/pterodactyl.js.map +1 -0
  41. package/dist/connectors/rcon.d.ts +51 -0
  42. package/dist/connectors/rcon.d.ts.map +1 -0
  43. package/dist/connectors/rcon.js +95 -0
  44. package/dist/connectors/rcon.js.map +1 -0
  45. package/dist/connectors/ssh.d.ts +65 -0
  46. package/dist/connectors/ssh.d.ts.map +1 -0
  47. package/dist/connectors/ssh.js +273 -0
  48. package/dist/connectors/ssh.js.map +1 -0
  49. package/dist/craft-close-skill.d.ts +106 -0
  50. package/dist/craft-close-skill.d.ts.map +1 -0
  51. package/dist/craft-close-skill.js +604 -0
  52. package/dist/craft-close-skill.js.map +1 -0
  53. package/dist/history.d.ts +32 -0
  54. package/dist/history.d.ts.map +1 -0
  55. package/dist/history.js +194 -0
  56. package/dist/history.js.map +1 -0
  57. package/dist/index.d.ts +16 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +28 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/openclaw-entry.d.ts +29 -0
  62. package/dist/openclaw-entry.d.ts.map +1 -0
  63. package/dist/openclaw-entry.js +45 -0
  64. package/dist/openclaw-entry.js.map +1 -0
  65. package/dist/patterns/index.d.ts +32 -0
  66. package/dist/patterns/index.d.ts.map +1 -0
  67. package/dist/patterns/index.js +248 -0
  68. package/dist/patterns/index.js.map +1 -0
  69. package/dist/security/action-allowlist.d.ts +21 -0
  70. package/dist/security/action-allowlist.d.ts.map +1 -0
  71. package/dist/security/action-allowlist.js +54 -0
  72. package/dist/security/action-allowlist.js.map +1 -0
  73. package/dist/security/audit-log.d.ts +22 -0
  74. package/dist/security/audit-log.d.ts.map +1 -0
  75. package/dist/security/audit-log.js +49 -0
  76. package/dist/security/audit-log.js.map +1 -0
  77. package/dist/security/index.d.ts +10 -0
  78. package/dist/security/index.d.ts.map +1 -0
  79. package/dist/security/index.js +20 -0
  80. package/dist/security/index.js.map +1 -0
  81. package/dist/security/input-sanitizer.d.ts +32 -0
  82. package/dist/security/input-sanitizer.d.ts.map +1 -0
  83. package/dist/security/input-sanitizer.js +81 -0
  84. package/dist/security/input-sanitizer.js.map +1 -0
  85. package/dist/security/path-jail.d.ts +25 -0
  86. package/dist/security/path-jail.d.ts.map +1 -0
  87. package/dist/security/path-jail.js +73 -0
  88. package/dist/security/path-jail.js.map +1 -0
  89. package/dist/security/rcon-filter.d.ts +24 -0
  90. package/dist/security/rcon-filter.d.ts.map +1 -0
  91. package/dist/security/rcon-filter.js +76 -0
  92. package/dist/security/rcon-filter.js.map +1 -0
  93. package/dist/types.d.ts +154 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +6 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +74 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Pterodactyl Connector — Monitor and control servers via Pterodactyl Panel API
3
+ *
4
+ * Supports: status, power actions, console commands, file access, resource usage.
5
+ */
6
+ import type { PterodactylConfig, HealthCheckResult } from "../types.js";
7
+ export interface PterodactylConnectorOptions {
8
+ serverName: string;
9
+ config: PterodactylConfig;
10
+ /** Request timeout in ms (default: 10000) */
11
+ timeout?: number;
12
+ }
13
+ export interface PteroResourceUsage {
14
+ state: "running" | "starting" | "stopping" | "offline";
15
+ cpu: number;
16
+ memory_bytes: number;
17
+ memory_limit_bytes: number;
18
+ disk_bytes: number;
19
+ disk_limit_bytes: number;
20
+ network_rx: number;
21
+ network_tx: number;
22
+ uptime_ms: number;
23
+ }
24
+ export interface PteroFileEntry {
25
+ name: string;
26
+ size: number;
27
+ is_file: boolean;
28
+ modified_at: string;
29
+ }
30
+ export declare class PterodactylConnector {
31
+ private readonly serverName;
32
+ private readonly baseUrl;
33
+ private readonly headers;
34
+ private readonly timeout;
35
+ private cachedMemoryLimitMb;
36
+ private cachedDiskLimitMb;
37
+ constructor(options: PterodactylConnectorOptions);
38
+ /**
39
+ * Internal fetch helper with timeout and error formatting.
40
+ */
41
+ private request;
42
+ /**
43
+ * Test API connectivity and authentication.
44
+ * Caches memory/disk limits from the server details response.
45
+ */
46
+ testConnection(): Promise<boolean>;
47
+ /**
48
+ * Fetch and cache server limits if not already cached.
49
+ */
50
+ private ensureLimits;
51
+ /**
52
+ * Get server resource usage (CPU, RAM, disk, status).
53
+ */
54
+ getResources(): Promise<PteroResourceUsage>;
55
+ /**
56
+ * Get health check result mapped from Pterodactyl resources.
57
+ */
58
+ getHealth(): Promise<Partial<HealthCheckResult>>;
59
+ /**
60
+ * Send power action (start, stop, restart, kill).
61
+ */
62
+ power(action: "start" | "stop" | "restart" | "kill"): Promise<void>;
63
+ /**
64
+ * Send a console command. Fire-and-forget — response is not returned.
65
+ */
66
+ sendCommand(command: string): Promise<void>;
67
+ /**
68
+ * Read a file from the server (e.g., /logs/latest.log).
69
+ */
70
+ readFile(path: string): Promise<string>;
71
+ /**
72
+ * List files in a directory on the server.
73
+ */
74
+ listFiles(directory: string): Promise<PteroFileEntry[]>;
75
+ /**
76
+ * Get TPS via console command — not possible via REST API.
77
+ * Pterodactyl's /command endpoint is fire-and-forget; output is only available via WebSocket.
78
+ */
79
+ getTpsViaCommand(): Promise<number | null>;
80
+ /**
81
+ * Get players via console command — not possible via REST API.
82
+ * Player count is not in /resources. Requires RCON or WebSocket.
83
+ */
84
+ getPlayersViaCommand(): Promise<{
85
+ online: number;
86
+ max: number;
87
+ list: string[];
88
+ } | null>;
89
+ }
90
+ //# sourceMappingURL=pterodactyl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pterodactyl.d.ts","sourceRoot":"","sources":["../../src/connectors/pterodactyl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,iBAAiB,CAAuB;gBAEpC,OAAO,EAAE,2BAA2B;IAchD;;OAEG;YACW,OAAO;IAuBrB;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBxC;;OAEG;YACW,YAAY;IAK1B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA0BjD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAqBtD;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczE;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7C;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmB7D;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIhD;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CAG9F"}
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ /**
3
+ * Pterodactyl Connector — Monitor and control servers via Pterodactyl Panel API
4
+ *
5
+ * Supports: status, power actions, console commands, file access, resource usage.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PterodactylConnector = void 0;
9
+ class PterodactylConnector {
10
+ serverName;
11
+ baseUrl;
12
+ headers;
13
+ timeout;
14
+ // Cached limits from testConnection / getServerDetails
15
+ cachedMemoryLimitMb = null;
16
+ cachedDiskLimitMb = null;
17
+ constructor(options) {
18
+ this.serverName = options.serverName;
19
+ this.timeout = options.timeout ?? 10_000;
20
+ // Normalize: strip trailing slash from panel_url
21
+ const panelUrl = options.config.panel_url.replace(/\/+$/u, "");
22
+ this.baseUrl = `${panelUrl}/api/client/servers/${options.config.server_id}`;
23
+ this.headers = {
24
+ "Authorization": `Bearer ${options.config.api_key}`,
25
+ "Content-Type": "application/json",
26
+ "Accept": "application/json",
27
+ };
28
+ }
29
+ /**
30
+ * Internal fetch helper with timeout and error formatting.
31
+ */
32
+ async request(path, options) {
33
+ const url = `${this.baseUrl}${path}`;
34
+ const controller = new AbortController();
35
+ const timer = setTimeout(() => controller.abort(), this.timeout);
36
+ try {
37
+ const response = await fetch(url, {
38
+ ...options,
39
+ headers: { ...this.headers, ...options?.headers },
40
+ signal: controller.signal,
41
+ });
42
+ return response;
43
+ }
44
+ catch (err) {
45
+ if (err instanceof DOMException && err.name === "AbortError") {
46
+ throw new Error(`[${this.serverName}] Pterodactyl request timed out: ${path}`);
47
+ }
48
+ const msg = err instanceof Error ? err.message : String(err);
49
+ throw new Error(`[${this.serverName}] Pterodactyl request failed: ${msg}`);
50
+ }
51
+ finally {
52
+ clearTimeout(timer);
53
+ }
54
+ }
55
+ /**
56
+ * Test API connectivity and authentication.
57
+ * Caches memory/disk limits from the server details response.
58
+ */
59
+ async testConnection() {
60
+ try {
61
+ const response = await this.request("/");
62
+ if (!response.ok)
63
+ return false;
64
+ const data = await response.json();
65
+ const attrs = data?.attributes;
66
+ if (!attrs)
67
+ return false;
68
+ if (attrs.limits) {
69
+ this.cachedMemoryLimitMb = attrs.limits.memory ?? null;
70
+ this.cachedDiskLimitMb = attrs.limits.disk ?? null;
71
+ }
72
+ console.log(`[CraftClose] Pterodactyl connected: ${this.serverName} — ` +
73
+ `${attrs.name ?? "unknown"} (RAM: ${attrs.limits?.memory ?? "?"}MB, Disk: ${attrs.limits?.disk ?? "?"}MB)`);
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * Fetch and cache server limits if not already cached.
82
+ */
83
+ async ensureLimits() {
84
+ if (this.cachedMemoryLimitMb !== null && this.cachedDiskLimitMb !== null)
85
+ return;
86
+ await this.testConnection();
87
+ }
88
+ /**
89
+ * Get server resource usage (CPU, RAM, disk, status).
90
+ */
91
+ async getResources() {
92
+ await this.ensureLimits();
93
+ const response = await this.request("/resources");
94
+ if (!response.ok) {
95
+ const body = await response.text().catch(() => "");
96
+ throw new Error(`[${this.serverName}] Pterodactyl /resources failed (${response.status}): ${body}`);
97
+ }
98
+ const data = await response.json();
99
+ const attrs = data?.attributes;
100
+ const res = attrs?.resources;
101
+ return {
102
+ state: attrs?.current_state ?? "offline",
103
+ cpu: res?.cpu_absolute ?? 0,
104
+ memory_bytes: res?.memory_bytes ?? 0,
105
+ memory_limit_bytes: (this.cachedMemoryLimitMb ?? 0) * 1024 * 1024,
106
+ disk_bytes: res?.disk_bytes ?? 0,
107
+ disk_limit_bytes: (this.cachedDiskLimitMb ?? 0) * 1024 * 1024,
108
+ network_rx: res?.network_rx_bytes ?? 0,
109
+ network_tx: res?.network_tx_bytes ?? 0,
110
+ uptime_ms: res?.uptime ?? 0,
111
+ };
112
+ }
113
+ /**
114
+ * Get health check result mapped from Pterodactyl resources.
115
+ */
116
+ async getHealth() {
117
+ const res = await this.getResources();
118
+ const ramUsedMb = res.memory_bytes / 1024 / 1024;
119
+ const ramTotalMb = res.memory_limit_bytes / 1024 / 1024;
120
+ const diskUsedMb = res.disk_bytes / 1024 / 1024;
121
+ const diskTotalMb = res.disk_limit_bytes / 1024 / 1024;
122
+ return {
123
+ online: res.state === "running",
124
+ cpu: res.cpu,
125
+ ram: ramTotalMb > 0
126
+ ? { used: Math.round(ramUsedMb), total: Math.round(ramTotalMb), percent: (ramUsedMb / ramTotalMb) * 100 }
127
+ : undefined,
128
+ disk: diskTotalMb > 0
129
+ ? { used: Math.round(diskUsedMb), total: Math.round(diskTotalMb), percent: (diskUsedMb / diskTotalMb) * 100 }
130
+ : undefined,
131
+ uptime: formatUptime(res.uptime_ms),
132
+ };
133
+ }
134
+ /**
135
+ * Send power action (start, stop, restart, kill).
136
+ */
137
+ async power(action) {
138
+ const response = await this.request("/power", {
139
+ method: "POST",
140
+ body: JSON.stringify({ signal: action }),
141
+ });
142
+ if (!response.ok) {
143
+ const body = await response.text().catch(() => "");
144
+ throw new Error(`[${this.serverName}] Pterodactyl power '${action}' failed (${response.status}): ${body}`);
145
+ }
146
+ console.log(`[CraftClose] Pterodactyl power '${action}' sent for ${this.serverName}`);
147
+ }
148
+ /**
149
+ * Send a console command. Fire-and-forget — response is not returned.
150
+ */
151
+ async sendCommand(command) {
152
+ const response = await this.request("/command", {
153
+ method: "POST",
154
+ body: JSON.stringify({ command }),
155
+ });
156
+ if (!response.ok) {
157
+ const body = await response.text().catch(() => "");
158
+ throw new Error(`[${this.serverName}] Pterodactyl command failed (${response.status}): ${body}`);
159
+ }
160
+ }
161
+ /**
162
+ * Read a file from the server (e.g., /logs/latest.log).
163
+ */
164
+ async readFile(path) {
165
+ const response = await this.request(`/files/contents?file=${encodeURIComponent(path)}`);
166
+ if (!response.ok) {
167
+ const body = await response.text().catch(() => "");
168
+ throw new Error(`[${this.serverName}] Pterodactyl readFile '${path}' failed (${response.status}): ${body}`);
169
+ }
170
+ return response.text();
171
+ }
172
+ /**
173
+ * List files in a directory on the server.
174
+ */
175
+ async listFiles(directory) {
176
+ const response = await this.request(`/files/list?directory=${encodeURIComponent(directory)}`);
177
+ if (!response.ok) {
178
+ const body = await response.text().catch(() => "");
179
+ throw new Error(`[${this.serverName}] Pterodactyl listFiles '${directory}' failed (${response.status}): ${body}`);
180
+ }
181
+ const data = await response.json();
182
+ const items = data?.data ?? [];
183
+ return items.map((item) => ({
184
+ name: item.attributes.name,
185
+ size: item.attributes.size,
186
+ is_file: item.attributes.is_file,
187
+ modified_at: item.attributes.modified_at,
188
+ }));
189
+ }
190
+ /**
191
+ * Get TPS via console command — not possible via REST API.
192
+ * Pterodactyl's /command endpoint is fire-and-forget; output is only available via WebSocket.
193
+ */
194
+ async getTpsViaCommand() {
195
+ return null;
196
+ }
197
+ /**
198
+ * Get players via console command — not possible via REST API.
199
+ * Player count is not in /resources. Requires RCON or WebSocket.
200
+ */
201
+ async getPlayersViaCommand() {
202
+ return null;
203
+ }
204
+ }
205
+ exports.PterodactylConnector = PterodactylConnector;
206
+ /** Format milliseconds uptime as human-readable string (e.g. "2h 35m"). */
207
+ function formatUptime(ms) {
208
+ const totalSeconds = Math.floor(ms / 1000);
209
+ const days = Math.floor(totalSeconds / 86400);
210
+ const hours = Math.floor((totalSeconds % 86400) / 3600);
211
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
212
+ const parts = [];
213
+ if (days > 0)
214
+ parts.push(`${days}d`);
215
+ if (hours > 0)
216
+ parts.push(`${hours}h`);
217
+ if (minutes > 0 || parts.length === 0)
218
+ parts.push(`${minutes}m`);
219
+ return parts.join(" ");
220
+ }
221
+ //# sourceMappingURL=pterodactyl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pterodactyl.js","sourceRoot":"","sources":["../../src/connectors/pterodactyl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * RCON Connector — Send commands to Minecraft servers via RCON protocol
3
+ *
4
+ * Handles TPS queries, player lists, and arbitrary console commands.
5
+ */
6
+ import type { RconConfig } from "../types.js";
7
+ export interface RconConnectorOptions {
8
+ serverName: string;
9
+ host: string;
10
+ config: RconConfig;
11
+ /** Connection timeout in ms (default: 5000) */
12
+ timeout?: number;
13
+ }
14
+ export declare class RconConnector {
15
+ private readonly options;
16
+ private rcon;
17
+ constructor(options: RconConnectorOptions);
18
+ /** Ensure the RCON client is connected. Reuses existing connection. */
19
+ private ensureConnected;
20
+ /**
21
+ * Test RCON connectivity and authentication.
22
+ */
23
+ testConnection(): Promise<boolean>;
24
+ /**
25
+ * Get current TPS (ticks per second).
26
+ * Parses the output of /tps command.
27
+ * @returns TPS value (0-20), or null if unavailable
28
+ */
29
+ getTps(): Promise<number | null>;
30
+ /**
31
+ * Get online player count and list.
32
+ */
33
+ getPlayers(): Promise<{
34
+ online: number;
35
+ max: number;
36
+ list: string[];
37
+ }>;
38
+ /**
39
+ * Get server version string.
40
+ */
41
+ getVersion(): Promise<string>;
42
+ /**
43
+ * Execute an arbitrary RCON command.
44
+ */
45
+ send(command: string): Promise<string>;
46
+ /**
47
+ * Close the RCON connection.
48
+ */
49
+ disconnect(): Promise<void>;
50
+ }
51
+ //# sourceMappingURL=rcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rcon.d.ts","sourceRoot":"","sources":["../../src/connectors/rcon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,IAAI,CAAqB;gBAErB,OAAO,EAAE,oBAAoB;IAIzC,uEAAuE;YACzD,eAAe;IAkB7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxC;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAM5E;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAMlC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * RCON Connector — Send commands to Minecraft servers via RCON protocol
4
+ *
5
+ * Handles TPS queries, player lists, and arbitrary console commands.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.RconConnector = void 0;
9
+ const rcon_client_1 = require("rcon-client");
10
+ const parsers_js_1 = require("./parsers.js");
11
+ class RconConnector {
12
+ options;
13
+ rcon = null;
14
+ constructor(options) {
15
+ this.options = options;
16
+ }
17
+ /** Ensure the RCON client is connected. Reuses existing connection. */
18
+ async ensureConnected() {
19
+ if (this.rcon) {
20
+ return this.rcon;
21
+ }
22
+ const { host, config, timeout } = this.options;
23
+ const rcon = new rcon_client_1.Rcon({
24
+ host: config.host ?? host,
25
+ port: config.port,
26
+ password: config.password,
27
+ timeout: timeout ?? 5000,
28
+ });
29
+ await rcon.connect();
30
+ this.rcon = rcon;
31
+ return rcon;
32
+ }
33
+ /**
34
+ * Test RCON connectivity and authentication.
35
+ */
36
+ async testConnection() {
37
+ try {
38
+ const rcon = await this.ensureConnected();
39
+ await rcon.send("list");
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Get current TPS (ticks per second).
48
+ * Parses the output of /tps command.
49
+ * @returns TPS value (0-20), or null if unavailable
50
+ */
51
+ async getTps() {
52
+ try {
53
+ const rcon = await this.ensureConnected();
54
+ const response = await rcon.send("tps");
55
+ return (0, parsers_js_1.parseTpsResponse)(response);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Get online player count and list.
63
+ */
64
+ async getPlayers() {
65
+ const rcon = await this.ensureConnected();
66
+ const response = await rcon.send("list");
67
+ return (0, parsers_js_1.parsePlayersResponse)(response) ?? { online: 0, max: 0, list: [] };
68
+ }
69
+ /**
70
+ * Get server version string.
71
+ */
72
+ async getVersion() {
73
+ const rcon = await this.ensureConnected();
74
+ const response = await rcon.send("version");
75
+ return (0, parsers_js_1.stripColorCodes)(response).trim();
76
+ }
77
+ /**
78
+ * Execute an arbitrary RCON command.
79
+ */
80
+ async send(command) {
81
+ const rcon = await this.ensureConnected();
82
+ return rcon.send(command);
83
+ }
84
+ /**
85
+ * Close the RCON connection.
86
+ */
87
+ async disconnect() {
88
+ if (this.rcon) {
89
+ await this.rcon.end();
90
+ this.rcon = null;
91
+ }
92
+ }
93
+ }
94
+ exports.RconConnector = RconConnector;
95
+ //# sourceMappingURL=rcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rcon.js","sourceRoot":"","sources":["../../src/connectors/rcon.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAAmC;AAEnC,6CAAuF;AAUvF,MAAa,aAAa;IACP,OAAO,CAAuB;IACvC,IAAI,GAAgB,IAAI,CAAC;IAEjC,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,kBAAI,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,OAAO,IAAI,IAAI;SACzB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,IAAA,6BAAgB,EAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,IAAA,iCAAoB,EAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,IAAA,4BAAe,EAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AA1FD,sCA0FC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * SSH Connector — Connect to Minecraft servers via SSH
3
+ *
4
+ * Handles health checks (CPU, RAM, disk), log tailing, and command execution.
5
+ */
6
+ import type { SshConfig, HealthCheckResult } from "../types.js";
7
+ export interface SshConnectorOptions {
8
+ serverName: string;
9
+ host: string;
10
+ config: SshConfig;
11
+ /** Path to server's latest.log (auto-detected if not specified) */
12
+ logPath?: string;
13
+ /** Connection timeout in ms (default: 10000) */
14
+ timeout?: number;
15
+ }
16
+ export declare class SshConnector {
17
+ private readonly options;
18
+ private conn;
19
+ private connected;
20
+ constructor(options: SshConnectorOptions);
21
+ /** Ensure the SSH client is connected. Reuses existing connection. */
22
+ private ensureConnected;
23
+ /**
24
+ * Execute a single command over SSH with a per-command timeout.
25
+ */
26
+ private execCommand;
27
+ /**
28
+ * Test SSH connectivity.
29
+ */
30
+ testConnection(): Promise<boolean>;
31
+ /**
32
+ * Get server health metrics via SSH.
33
+ */
34
+ getHealth(): Promise<Partial<HealthCheckResult>>;
35
+ /**
36
+ * Read the last N lines of the server log.
37
+ */
38
+ tailLog(lines?: number): Promise<string>;
39
+ /**
40
+ * Execute a command on the remote server (e.g., restart).
41
+ */
42
+ exec(command: string): Promise<{
43
+ stdout: string;
44
+ stderr: string;
45
+ code: number;
46
+ }>;
47
+ /**
48
+ * Create a local port forward through the SSH connection.
49
+ * Returns the local port number and a close function.
50
+ */
51
+ createTunnel(remoteHost: string, remotePort: number): Promise<{
52
+ localPort: number;
53
+ close: () => void;
54
+ }>;
55
+ /**
56
+ * Execute a Minecraft console command via docker exec.
57
+ * Useful when RCON isn't configured at all.
58
+ */
59
+ dockerRcon(containerName: string, command: string): Promise<string>;
60
+ /**
61
+ * Close the SSH connection.
62
+ */
63
+ disconnect(): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=ssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/connectors/ssh.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqBD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,mBAAmB;IAIxC,sEAAsE;YACxD,eAAe;IAoD7B;;OAEG;YACW,WAAW;IAiCzB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASxC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAgDtD;;OAEG;IACG,OAAO,CAAC,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CnD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAItF;;;OAGG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAyB7G;;;OAGG;IACG,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC"}