telegram-ssh-bot 2.0.0 → 2.2.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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -22
  3. package/deploy/.env.example +86 -0
  4. package/dist/config/index.d.ts +68 -0
  5. package/dist/config/index.d.ts.map +1 -0
  6. package/dist/config/index.js +315 -0
  7. package/dist/config/index.js.map +1 -0
  8. package/dist/config/schema.d.ts +6 -0
  9. package/dist/config/schema.d.ts.map +1 -0
  10. package/dist/config/schema.js +50 -0
  11. package/dist/config/schema.js.map +1 -0
  12. package/dist/core/Bot.d.ts +91 -0
  13. package/dist/core/Bot.d.ts.map +1 -0
  14. package/dist/core/Bot.js +263 -0
  15. package/dist/core/Bot.js.map +1 -0
  16. package/dist/core/ConnectionPool.d.ts +125 -0
  17. package/dist/core/ConnectionPool.d.ts.map +1 -0
  18. package/dist/core/ConnectionPool.js +397 -0
  19. package/dist/core/ConnectionPool.js.map +1 -0
  20. package/dist/core/SSHClient.d.ts +112 -0
  21. package/dist/core/SSHClient.d.ts.map +1 -0
  22. package/dist/core/SSHClient.js +367 -0
  23. package/dist/core/SSHClient.js.map +1 -0
  24. package/dist/core/ServerManager.d.ts +80 -0
  25. package/dist/core/ServerManager.d.ts.map +1 -0
  26. package/dist/core/ServerManager.js +207 -0
  27. package/dist/core/ServerManager.js.map +1 -0
  28. package/dist/core/index.d.ts +8 -0
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +8 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/errors/AuthError.d.ts +30 -0
  33. package/dist/errors/AuthError.d.ts.map +1 -0
  34. package/dist/errors/AuthError.js +35 -0
  35. package/dist/errors/AuthError.js.map +1 -0
  36. package/dist/errors/BaseError.d.ts +17 -0
  37. package/dist/errors/BaseError.d.ts.map +1 -0
  38. package/dist/errors/BaseError.js +34 -0
  39. package/dist/errors/BaseError.js.map +1 -0
  40. package/dist/errors/ConfigurationError.d.ts +24 -0
  41. package/dist/errors/ConfigurationError.d.ts.map +1 -0
  42. package/dist/errors/ConfigurationError.js +24 -0
  43. package/dist/errors/ConfigurationError.js.map +1 -0
  44. package/dist/errors/PoolError.d.ts +21 -0
  45. package/dist/errors/PoolError.d.ts.map +1 -0
  46. package/dist/errors/PoolError.js +30 -0
  47. package/dist/errors/PoolError.js.map +1 -0
  48. package/dist/errors/SSHError.d.ts +24 -0
  49. package/dist/errors/SSHError.d.ts.map +1 -0
  50. package/dist/errors/SSHError.js +38 -0
  51. package/dist/errors/SSHError.js.map +1 -0
  52. package/dist/errors/StorageError.d.ts +24 -0
  53. package/dist/errors/StorageError.d.ts.map +1 -0
  54. package/dist/errors/StorageError.js +35 -0
  55. package/dist/errors/StorageError.js.map +1 -0
  56. package/dist/errors/ValidationError.d.ts +29 -0
  57. package/dist/errors/ValidationError.d.ts.map +1 -0
  58. package/dist/errors/ValidationError.js +35 -0
  59. package/dist/errors/ValidationError.js.map +1 -0
  60. package/dist/errors/index.d.ts +11 -0
  61. package/dist/errors/index.d.ts.map +1 -0
  62. package/dist/errors/index.js +18 -0
  63. package/dist/errors/index.js.map +1 -0
  64. package/dist/handlers/BaseHandler.d.ts +50 -0
  65. package/dist/handlers/BaseHandler.d.ts.map +1 -0
  66. package/dist/handlers/BaseHandler.js +87 -0
  67. package/dist/handlers/BaseHandler.js.map +1 -0
  68. package/dist/handlers/CommandHandler.d.ts +23 -0
  69. package/dist/handlers/CommandHandler.d.ts.map +1 -0
  70. package/dist/handlers/CommandHandler.js +99 -0
  71. package/dist/handlers/CommandHandler.js.map +1 -0
  72. package/dist/handlers/HealthHandler.d.ts +25 -0
  73. package/dist/handlers/HealthHandler.d.ts.map +1 -0
  74. package/dist/handlers/HealthHandler.js +51 -0
  75. package/dist/handlers/HealthHandler.js.map +1 -0
  76. package/dist/handlers/HelpHandler.d.ts +32 -0
  77. package/dist/handlers/HelpHandler.d.ts.map +1 -0
  78. package/dist/handlers/HelpHandler.js +76 -0
  79. package/dist/handlers/HelpHandler.js.map +1 -0
  80. package/dist/handlers/ServerHandler.d.ts +72 -0
  81. package/dist/handlers/ServerHandler.d.ts.map +1 -0
  82. package/dist/handlers/ServerHandler.js +272 -0
  83. package/dist/handlers/ServerHandler.js.map +1 -0
  84. package/dist/handlers/index.d.ts +9 -0
  85. package/dist/handlers/index.d.ts.map +1 -0
  86. package/dist/handlers/index.js +9 -0
  87. package/dist/handlers/index.js.map +1 -0
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +348 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/middleware/AuthMiddleware.d.ts +28 -0
  93. package/dist/middleware/AuthMiddleware.d.ts.map +1 -0
  94. package/dist/middleware/AuthMiddleware.js +49 -0
  95. package/dist/middleware/AuthMiddleware.js.map +1 -0
  96. package/dist/middleware/RateLimitMiddleware.d.ts +23 -0
  97. package/dist/middleware/RateLimitMiddleware.d.ts.map +1 -0
  98. package/dist/middleware/RateLimitMiddleware.js +34 -0
  99. package/dist/middleware/RateLimitMiddleware.js.map +1 -0
  100. package/dist/middleware/index.d.ts +6 -0
  101. package/dist/middleware/index.d.ts.map +1 -0
  102. package/dist/middleware/index.js +6 -0
  103. package/dist/middleware/index.js.map +1 -0
  104. package/dist/services/BackupService.d.ts +119 -0
  105. package/dist/services/BackupService.d.ts.map +1 -0
  106. package/dist/services/BackupService.js +313 -0
  107. package/dist/services/BackupService.js.map +1 -0
  108. package/dist/services/CryptoService.d.ts +37 -0
  109. package/dist/services/CryptoService.d.ts.map +1 -0
  110. package/dist/services/CryptoService.js +108 -0
  111. package/dist/services/CryptoService.js.map +1 -0
  112. package/dist/services/HealthService.d.ts +126 -0
  113. package/dist/services/HealthService.d.ts.map +1 -0
  114. package/dist/services/HealthService.js +213 -0
  115. package/dist/services/HealthService.js.map +1 -0
  116. package/dist/services/LoggingService.d.ts +115 -0
  117. package/dist/services/LoggingService.d.ts.map +1 -0
  118. package/dist/services/LoggingService.js +334 -0
  119. package/dist/services/LoggingService.js.map +1 -0
  120. package/dist/services/MonitoringService.d.ts +119 -0
  121. package/dist/services/MonitoringService.d.ts.map +1 -0
  122. package/dist/services/MonitoringService.js +267 -0
  123. package/dist/services/MonitoringService.js.map +1 -0
  124. package/dist/services/NotificationService.d.ts +132 -0
  125. package/dist/services/NotificationService.d.ts.map +1 -0
  126. package/dist/services/NotificationService.js +297 -0
  127. package/dist/services/NotificationService.js.map +1 -0
  128. package/dist/services/RateLimiter.d.ts +51 -0
  129. package/dist/services/RateLimiter.d.ts.map +1 -0
  130. package/dist/services/RateLimiter.js +141 -0
  131. package/dist/services/RateLimiter.js.map +1 -0
  132. package/dist/services/ValidationService.d.ts +49 -0
  133. package/dist/services/ValidationService.d.ts.map +1 -0
  134. package/dist/services/ValidationService.js +158 -0
  135. package/dist/services/ValidationService.js.map +1 -0
  136. package/dist/services/index.d.ts +12 -0
  137. package/dist/services/index.d.ts.map +1 -0
  138. package/dist/services/index.js +12 -0
  139. package/dist/services/index.js.map +1 -0
  140. package/dist/types/Bot.d.ts +63 -0
  141. package/dist/types/Bot.d.ts.map +1 -0
  142. package/dist/types/Bot.js +5 -0
  143. package/dist/types/Bot.js.map +1 -0
  144. package/dist/types/Config.d.ts +57 -0
  145. package/dist/types/Config.d.ts.map +1 -0
  146. package/dist/types/Config.js +5 -0
  147. package/dist/types/Config.js.map +1 -0
  148. package/dist/types/Errors.d.ts +37 -0
  149. package/dist/types/Errors.d.ts.map +1 -0
  150. package/dist/types/Errors.js +34 -0
  151. package/dist/types/Errors.js.map +1 -0
  152. package/dist/types/SSH.d.ts +56 -0
  153. package/dist/types/SSH.d.ts.map +1 -0
  154. package/dist/types/SSH.js +6 -0
  155. package/dist/types/SSH.js.map +1 -0
  156. package/dist/types/Server.d.ts +39 -0
  157. package/dist/types/Server.d.ts.map +1 -0
  158. package/dist/types/Server.js +5 -0
  159. package/dist/types/Server.js.map +1 -0
  160. package/dist/types/index.d.ts +10 -0
  161. package/dist/types/index.d.ts.map +1 -0
  162. package/dist/types/index.js +6 -0
  163. package/dist/types/index.js.map +1 -0
  164. package/dist/utils/commandUtils.d.ts +25 -0
  165. package/dist/utils/commandUtils.d.ts.map +1 -0
  166. package/dist/utils/commandUtils.js +94 -0
  167. package/dist/utils/commandUtils.js.map +1 -0
  168. package/dist/utils/fileUtils.d.ts +40 -0
  169. package/dist/utils/fileUtils.d.ts.map +1 -0
  170. package/dist/utils/fileUtils.js +114 -0
  171. package/dist/utils/fileUtils.js.map +1 -0
  172. package/dist/utils/index.d.ts +7 -0
  173. package/dist/utils/index.d.ts.map +1 -0
  174. package/dist/utils/index.js +7 -0
  175. package/dist/utils/index.js.map +1 -0
  176. package/dist/utils/pathUtils.d.ts +40 -0
  177. package/dist/utils/pathUtils.d.ts.map +1 -0
  178. package/dist/utils/pathUtils.js +140 -0
  179. package/dist/utils/pathUtils.js.map +1 -0
  180. package/package.json +31 -5
  181. package/scripts/build.sh +20 -0
  182. package/scripts/postinstall.js +87 -0
  183. package/scripts/release.sh +22 -0
  184. package/scripts/setup-env.js +237 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Base Command Handler
3
+ * Provides common functionality for all command handlers
4
+ */
5
+ /**
6
+ * Base command handler with common functionality
7
+ */
8
+ export class BaseHandler {
9
+ serverManager;
10
+ sshClient;
11
+ bot;
12
+ logger;
13
+ constructor(serverManager, sshClient, bot, logger) {
14
+ this.serverManager = serverManager;
15
+ this.sshClient = sshClient;
16
+ this.bot = bot;
17
+ this.logger = logger;
18
+ }
19
+ /**
20
+ * Send a message to the chat
21
+ */
22
+ async send(chatId, message) {
23
+ await this.bot.sendMessage(chatId, message);
24
+ }
25
+ /**
26
+ * Send a markdown message to the chat
27
+ */
28
+ async sendMarkdown(chatId, message) {
29
+ await this.bot.sendMessage(chatId, message, { parseMode: "Markdown" });
30
+ }
31
+ /**
32
+ * Get current server or send error message
33
+ */
34
+ getCurrentServerOrError(chatId) {
35
+ const current = this.serverManager.getCurrent();
36
+ if (!current) {
37
+ this.send(chatId, "❌ No server connected. Use /ssh <index> to connect first.");
38
+ return null;
39
+ }
40
+ return current;
41
+ }
42
+ /**
43
+ * Check if SSH is connected or send error message
44
+ */
45
+ checkConnectionOrError(chatId) {
46
+ if (!this.sshClient.isConnected()) {
47
+ this.send(chatId, "❌ Not connected to SSH server. Use /ssh <index> to connect.");
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ /**
53
+ * Format server list for display
54
+ */
55
+ formatServerList(servers) {
56
+ if (servers.length === 0) {
57
+ return "📋 No servers configured.\n\nUse /add to add a server.";
58
+ }
59
+ const current = this.serverManager.getCurrent();
60
+ const lines = ["📋 *Configured Servers:*\n"];
61
+ servers.forEach((server, index) => {
62
+ const isCurrent = current?.id === server.id;
63
+ const marker = isCurrent ? "✓ " : " ";
64
+ const note = server.note ? ` (${server.note})` : "";
65
+ lines.push(`${marker}${index + 1}. \`${server.username}@${server.host}:${server.port}\`${note}`);
66
+ });
67
+ lines.push("\n_use /ssh <index> to connect_");
68
+ return lines.join("\n");
69
+ }
70
+ /**
71
+ * Format server info for display
72
+ */
73
+ formatServerInfo(server) {
74
+ const lines = [
75
+ `🖥️ *Server Info*`,
76
+ `• Host: \`${server.host}\``,
77
+ `• Port: \`${server.port}\``,
78
+ `• User: \`${server.username}\``,
79
+ `• Auth: \`${server.auth.type}\``,
80
+ ];
81
+ if (server.note) {
82
+ lines.push(`• Note: ${server.note}`);
83
+ }
84
+ return lines.join("\n");
85
+ }
86
+ }
87
+ //# sourceMappingURL=BaseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseHandler.js","sourceRoot":"","sources":["../../src/handlers/BaseHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Command Handler
3
+ * Handles SSH command execution
4
+ */
5
+ import { ServerManager } from "../core/ServerManager.js";
6
+ import { SSHClient } from "../core/SSHClient.js";
7
+ import { LoggingService } from "../services/LoggingService.js";
8
+ import { ValidationService } from "../services/ValidationService.js";
9
+ import type { CommandContext } from "../types/index.js";
10
+ import { IBot } from "../types/index.js";
11
+ import { BaseHandler } from "./BaseHandler.js";
12
+ /**
13
+ * Handler for SSH command execution (non-command messages when connected)
14
+ */
15
+ export declare class SSHCommandHandler extends BaseHandler {
16
+ readonly name = "_message";
17
+ readonly description = "Execute SSH commands";
18
+ readonly pattern: RegExp;
19
+ private readonly validationService;
20
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService, validationService: ValidationService);
21
+ execute(context: CommandContext): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=CommandHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/CommandHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,0BAA0B;IAC9C,QAAQ,CAAC,OAAO,SAAQ;IAExB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAGpD,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,iBAAiB;IAMhC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAuGtD"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Command Handler
3
+ * Handles SSH command execution
4
+ */
5
+ import { ConnectionFailedError, ConnectionTimeoutError, DisconnectedError, } from "../errors/index.js";
6
+ import { BaseHandler } from "./BaseHandler.js";
7
+ /**
8
+ * Handler for SSH command execution (non-command messages when connected)
9
+ */
10
+ export class SSHCommandHandler extends BaseHandler {
11
+ name = "_message";
12
+ description = "Execute SSH commands";
13
+ pattern = /.*/;
14
+ validationService;
15
+ constructor(serverManager, sshClient, bot, logger, validationService) {
16
+ super(serverManager, sshClient, bot, logger);
17
+ this.validationService = validationService;
18
+ }
19
+ async execute(context) {
20
+ const command = context.args.trim();
21
+ if (!command) {
22
+ return;
23
+ }
24
+ // Check connection
25
+ if (!this.sshClient.isConnected()) {
26
+ await this.send(context.chatId, "❌ Not connected to any server.\nUse /ssh <index> to connect first.");
27
+ return;
28
+ }
29
+ // Validate and sanitize command
30
+ const validation = this.validationService.validateCommand(command);
31
+ if (!validation.valid) {
32
+ await this.send(context.chatId, `❌ ${validation.error}`);
33
+ this.logger.warn("Blocked unsafe command", {
34
+ command,
35
+ reason: validation.error,
36
+ chatId: context.chatId,
37
+ });
38
+ return;
39
+ }
40
+ if (!validation.data) {
41
+ throw new Error("Validation data is missing");
42
+ }
43
+ const sanitizedCommand = validation.data;
44
+ this.logger.info("Executing SSH command", {
45
+ command: sanitizedCommand.sanitized,
46
+ chatId: context.chatId,
47
+ });
48
+ try {
49
+ const result = await this.sshClient.execute(sanitizedCommand.sanitized);
50
+ // Format output
51
+ let output = "";
52
+ if (result.stdout) {
53
+ output += result.stdout;
54
+ }
55
+ if (result.stderr) {
56
+ output += `\n⚠️ stderr:\n${result.stderr}`;
57
+ }
58
+ // Truncate if too long
59
+ if (output.length > 4000) {
60
+ output = output.substring(0, 4000) + "\n... (output truncated)";
61
+ }
62
+ if (output.trim()) {
63
+ await this.send(context.chatId, `\`\`\`\n${output}\n\`\`\``);
64
+ }
65
+ else {
66
+ await this.send(context.chatId, "✅ Command executed (no output)");
67
+ }
68
+ // Log if non-zero exit code
69
+ if (result.exitCode !== 0 && result.exitCode !== null) {
70
+ this.logger.warn("Command exited with non-zero code", {
71
+ command: sanitizedCommand.sanitized,
72
+ exitCode: result.exitCode,
73
+ chatId: context.chatId,
74
+ });
75
+ }
76
+ }
77
+ catch (error) {
78
+ if (error instanceof DisconnectedError) {
79
+ await this.send(context.chatId, "❌ Connection lost. Please reconnect with /ssh <index>");
80
+ this.serverManager.clearCurrent();
81
+ }
82
+ else if (error instanceof ConnectionTimeoutError) {
83
+ await this.send(context.chatId, "❌ Connection timed out. The server may be unreachable.");
84
+ }
85
+ else if (error instanceof ConnectionFailedError) {
86
+ await this.send(context.chatId, "❌ Connection failed. Please check the server status and try again.");
87
+ }
88
+ else {
89
+ const message = error instanceof Error ? error.message : "Command execution failed";
90
+ await this.send(context.chatId, `❌ ${message}`);
91
+ }
92
+ this.logger.error("SSH command failed", error instanceof Error ? error : new Error(String(error)), {
93
+ command: sanitizedCommand.sanitized,
94
+ chatId: context.chatId,
95
+ });
96
+ }
97
+ }
98
+ }
99
+ //# sourceMappingURL=CommandHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandHandler.js","sourceRoot":"","sources":["../../src/handlers/CommandHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IACvC,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,sBAAsB,CAAC;IACrC,OAAO,GAAG,IAAI,CAAC;IAEP,iBAAiB,CAAoB;IAEtD,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB,EACtB,iBAAoC;QAEpC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,oEAAoE,CACrE,CAAC;YACF,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACzC,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,KAAK;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxC,OAAO,EAAE,gBAAgB,CAAC,SAAS;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAExE,gBAAgB;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;YAC1B,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,CAAC;YAED,uBAAuB;YACvB,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,0BAA0B,CAAC;YAClE,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,UAAU,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;YACpE,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;oBACpD,OAAO,EAAE,gBAAgB,CAAC,SAAS;oBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBACvC,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,uDAAuD,CACxD,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;YACpC,CAAC;iBAAM,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBACnD,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,wDAAwD,CACzD,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,IAAI,CACb,OAAO,CAAC,MAAM,EACd,oEAAoE,CACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;gBACtE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD;gBACE,OAAO,EAAE,gBAAgB,CAAC,SAAS;gBACnC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Health Handler
3
+ * Handles /health command to show system health status
4
+ */
5
+ import { ServerManager } from "../core/ServerManager.js";
6
+ import { SSHClient } from "../core/SSHClient.js";
7
+ import { HealthService } from "../services/HealthService.js";
8
+ import { LoggingService } from "../services/LoggingService.js";
9
+ import type { CommandContext, IBot, ICommandHandler } from "../types/index.js";
10
+ /**
11
+ * Handler for /health command - show system health status
12
+ */
13
+ export declare class HealthHandler implements ICommandHandler {
14
+ readonly name = "health";
15
+ readonly description = "Show system health status";
16
+ readonly pattern: RegExp;
17
+ private readonly serverManager;
18
+ private readonly sshClient;
19
+ private readonly bot;
20
+ private readonly logger;
21
+ private readonly healthService;
22
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService, healthService: HealthService);
23
+ execute(context: CommandContext): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=HealthHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealthHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/HealthHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,+BAA+B;IACnD,QAAQ,CAAC,OAAO,SAAe;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAO;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAG5C,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,aAAa;IASxB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BtD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Health Handler
3
+ * Handles /health command to show system health status
4
+ */
5
+ /**
6
+ * Handler for /health command - show system health status
7
+ */
8
+ export class HealthHandler {
9
+ name = "health";
10
+ description = "Show system health status";
11
+ pattern = /^\/health/;
12
+ serverManager;
13
+ sshClient;
14
+ bot;
15
+ logger;
16
+ healthService;
17
+ constructor(serverManager, sshClient, bot, logger, healthService) {
18
+ this.serverManager = serverManager;
19
+ this.sshClient = sshClient;
20
+ this.bot = bot;
21
+ this.logger = logger;
22
+ this.healthService = healthService;
23
+ }
24
+ async execute(context) {
25
+ try {
26
+ // Update health service with current metrics
27
+ const servers = await this.serverManager.list();
28
+ this.healthService.setTotalServers(servers.length);
29
+ this.healthService.setActiveConnections(this.sshClient.isConnected() ? 1 : 0);
30
+ this.healthService.setStorageHealth(true);
31
+ this.healthService.setBotHealth(true);
32
+ // Get formatted health report
33
+ const report = this.healthService.getFormattedHealthReport();
34
+ await this.bot.sendMessage(context.chatId, report, {
35
+ parseMode: "Markdown",
36
+ });
37
+ this.logger.debug("Health status requested", {
38
+ chatId: context.chatId,
39
+ ...this.healthService.getLogContext(),
40
+ });
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : "Failed to get health status";
44
+ await this.bot.sendMessage(context.chatId, `❌ ${message}`);
45
+ this.logger.error("Failed to get health status", error, {
46
+ chatId: context.chatId,
47
+ });
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=HealthHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealthHandler.js","sourceRoot":"","sources":["../../src/handlers/HealthHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,2BAA2B,CAAC;IAC1C,OAAO,GAAG,WAAW,CAAC;IAEd,aAAa,CAAgB;IAC7B,SAAS,CAAY;IACrB,GAAG,CAAO;IACV,MAAM,CAAiB;IACvB,aAAa,CAAgB;IAE9C,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB,EACtB,aAA4B;QAE5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CACrC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrC,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAEtC,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;YAE7D,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;gBACjD,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBAC3C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YACzE,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAc,EAAE;gBAC/D,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Help Handler
3
+ * Handles /help and /start commands
4
+ */
5
+ import { BaseHandler } from './BaseHandler.js';
6
+ import type { CommandContext } from '../types/index.js';
7
+ import { ServerManager } from '../core/ServerManager.js';
8
+ import { SSHClient } from '../core/SSHClient.js';
9
+ import { LoggingService } from '../services/LoggingService.js';
10
+ import { IBot } from '../types/index.js';
11
+ /**
12
+ * Handler for /help command
13
+ */
14
+ export declare class HelpHandler extends BaseHandler {
15
+ readonly name = "help";
16
+ readonly description = "Show help message";
17
+ readonly pattern: RegExp;
18
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
19
+ execute(context: CommandContext): Promise<void>;
20
+ private getHelpMessage;
21
+ }
22
+ /**
23
+ * Handler for /start command
24
+ */
25
+ export declare class StartHandler extends BaseHandler {
26
+ readonly name = "start";
27
+ readonly description = "Start the bot";
28
+ readonly pattern: RegExp;
29
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
30
+ execute(context: CommandContext): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=HelpHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/HelpHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,uBAAuB;IAC3C,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,OAAO,CAAC,cAAc;CA+BvB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,mBAAmB;IACvC,QAAQ,CAAC,OAAO,SAAc;gBAG5B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAetD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Help Handler
3
+ * Handles /help and /start commands
4
+ */
5
+ import { BaseHandler } from './BaseHandler.js';
6
+ /**
7
+ * Handler for /help command
8
+ */
9
+ export class HelpHandler extends BaseHandler {
10
+ name = 'help';
11
+ description = 'Show help message';
12
+ pattern = /^\/help/;
13
+ constructor(serverManager, sshClient, bot, logger) {
14
+ super(serverManager, sshClient, bot, logger);
15
+ }
16
+ async execute(context) {
17
+ const message = this.getHelpMessage();
18
+ await this.sendMarkdown(context.chatId, message);
19
+ }
20
+ getHelpMessage() {
21
+ return `🤖 *Telegram SSH Bot*
22
+
23
+ *Available Commands:*
24
+
25
+ 📋 *Server Management:*
26
+ • /add <host> <user> [pass] [port] [note] - Add server
27
+ • /rm <index> - Remove server
28
+ • /list - List all servers
29
+ • /current - Show current server
30
+
31
+ 🔌 *SSH Connection:*
32
+ • /ssh <index> - Connect to server
33
+ • /exit - Disconnect from server
34
+
35
+ ❓ *Help:*
36
+ • /help - Show this message
37
+ • /start - Start the bot
38
+
39
+ *Usage:*
40
+ 1. Add a server with /add
41
+ 2. Connect with /ssh <index>
42
+ 3. Send any command to execute on server
43
+ 4. Use /exit to disconnect
44
+
45
+ ⚠️ *Security Notes:*
46
+ • Only authorized users can use this bot
47
+ • Commands are sanitized for safety
48
+ • Credentials are encrypted at rest
49
+ `;
50
+ }
51
+ }
52
+ /**
53
+ * Handler for /start command
54
+ */
55
+ export class StartHandler extends BaseHandler {
56
+ name = 'start';
57
+ description = 'Start the bot';
58
+ pattern = /^\/start/;
59
+ constructor(serverManager, sshClient, bot, logger) {
60
+ super(serverManager, sshClient, bot, logger);
61
+ }
62
+ async execute(context) {
63
+ const message = `🤖 *Welcome to Telegram SSH Bot!*
64
+
65
+ This bot allows you to manage and connect to SSH servers directly from Telegram.
66
+
67
+ Use /help to see available commands.
68
+ `;
69
+ await this.sendMarkdown(context.chatId, message);
70
+ this.logger.info('Bot started for user', {
71
+ userId: context.userId,
72
+ chatId: context.chatId
73
+ });
74
+ }
75
+ }
76
+ //# sourceMappingURL=HelpHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpHandler.js","sourceRoot":"","sources":["../../src/handlers/HelpHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IACjC,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,mBAAmB,CAAC;IAClC,OAAO,GAAG,SAAS,CAAC;IAE7B,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB;QAEtB,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc;QACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BV,CAAC;IACA,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAClC,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,eAAe,CAAC;IAC9B,OAAO,GAAG,UAAU,CAAC;IAE9B,YACE,aAA4B,EAC5B,SAAoB,EACpB,GAAS,EACT,MAAsB;QAEtB,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,OAAO,GAAG;;;;;CAKnB,CAAC;QAEE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Server Handler
3
+ * Handles server management commands: /add, /rm, /list, /ssh, /exit, /current
4
+ */
5
+ import { ServerManager } from "../core/ServerManager.js";
6
+ import { SSHClient } from "../core/SSHClient.js";
7
+ import { LoggingService } from "../services/LoggingService.js";
8
+ import type { CommandContext } from "../types/index.js";
9
+ import { IBot } from "../types/index.js";
10
+ import { BaseHandler } from "./BaseHandler.js";
11
+ /**
12
+ * Handler for /add command - add a new server
13
+ */
14
+ export declare class AddServerHandler extends BaseHandler {
15
+ readonly name = "add";
16
+ readonly description = "Add a new server configuration";
17
+ readonly pattern: RegExp;
18
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
19
+ execute(context: CommandContext): Promise<void>;
20
+ private parseArgs;
21
+ }
22
+ /**
23
+ * Handler for /rm command - remove a server
24
+ */
25
+ export declare class RemoveServerHandler extends BaseHandler {
26
+ readonly name = "rm";
27
+ readonly description = "Remove a server by index";
28
+ readonly pattern: RegExp;
29
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
30
+ execute(context: CommandContext): Promise<void>;
31
+ }
32
+ /**
33
+ * Handler for /list command - list all servers
34
+ */
35
+ export declare class ListServerHandler extends BaseHandler {
36
+ readonly name = "list";
37
+ readonly description = "List all configured servers";
38
+ readonly pattern: RegExp;
39
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
40
+ execute(context: CommandContext): Promise<void>;
41
+ }
42
+ /**
43
+ * Handler for /ssh command - connect to a server
44
+ */
45
+ export declare class SSHServerHandler extends BaseHandler {
46
+ readonly name = "ssh";
47
+ readonly description = "Connect to a server by index";
48
+ readonly pattern: RegExp;
49
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
50
+ execute(context: CommandContext): Promise<void>;
51
+ }
52
+ /**
53
+ * Handler for /exit command - disconnect from current server
54
+ */
55
+ export declare class ExitServerHandler extends BaseHandler {
56
+ readonly name = "exit";
57
+ readonly description = "Disconnect from current SSH session";
58
+ readonly pattern: RegExp;
59
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
60
+ execute(context: CommandContext): Promise<void>;
61
+ }
62
+ /**
63
+ * Handler for /current command - show current server
64
+ */
65
+ export declare class CurrentServerHandler extends BaseHandler {
66
+ readonly name = "current";
67
+ readonly description = "Show current connected server";
68
+ readonly pattern: RegExp;
69
+ constructor(serverManager: ServerManager, sshClient: SSHClient, bot: IBot, logger: LoggingService);
70
+ execute(context: CommandContext): Promise<void>;
71
+ }
72
+ //# sourceMappingURL=ServerHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ServerHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,oCAAoC;IACxD,QAAQ,CAAC,OAAO,SAAY;gBAG1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DrD,OAAO,CAAC,SAAS;CAyBlB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,WAAW,8BAA8B;IAClD,QAAQ,CAAC,OAAO,SAAW;gBAGzB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAoDtD;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,iCAAiC;IACrD,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKtD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kCAAkC;IACtD,QAAQ,CAAC,OAAO,SAAY;gBAG1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAsGtD;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,yCAAyC;IAC7D,QAAQ,CAAC,OAAO,SAAa;gBAG3B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBtD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,OAAO,SAAgB;gBAG9B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,cAAc;IAKlB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBtD"}