rackmind-cli 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +179 -0
  2. package/bin/rackmind.js +6 -0
  3. package/dist/ai/client.d.ts +71 -0
  4. package/dist/ai/client.d.ts.map +1 -0
  5. package/dist/ai/client.js +198 -0
  6. package/dist/ai/client.js.map +1 -0
  7. package/dist/ai/system-prompt.d.ts +20 -0
  8. package/dist/ai/system-prompt.d.ts.map +1 -0
  9. package/dist/ai/system-prompt.js +169 -0
  10. package/dist/ai/system-prompt.js.map +1 -0
  11. package/dist/ai/tool-executor.d.ts +27 -0
  12. package/dist/ai/tool-executor.d.ts.map +1 -0
  13. package/dist/ai/tool-executor.js +184 -0
  14. package/dist/ai/tool-executor.js.map +1 -0
  15. package/dist/ai/tools.d.ts +7 -0
  16. package/dist/ai/tools.d.ts.map +1 -0
  17. package/dist/ai/tools.js +203 -0
  18. package/dist/ai/tools.js.map +1 -0
  19. package/dist/commands/config.d.ts +21 -0
  20. package/dist/commands/config.d.ts.map +1 -0
  21. package/dist/commands/config.js +169 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/connect.d.ts +7 -0
  24. package/dist/commands/connect.d.ts.map +1 -0
  25. package/dist/commands/connect.js +117 -0
  26. package/dist/commands/connect.js.map +1 -0
  27. package/dist/commands/containers.d.ts +5 -0
  28. package/dist/commands/containers.d.ts.map +1 -0
  29. package/dist/commands/containers.js +83 -0
  30. package/dist/commands/containers.js.map +1 -0
  31. package/dist/commands/exec.d.ts +5 -0
  32. package/dist/commands/exec.d.ts.map +1 -0
  33. package/dist/commands/exec.js +133 -0
  34. package/dist/commands/exec.js.map +1 -0
  35. package/dist/commands/lifecycle.d.ts +7 -0
  36. package/dist/commands/lifecycle.d.ts.map +1 -0
  37. package/dist/commands/lifecycle.js +213 -0
  38. package/dist/commands/lifecycle.js.map +1 -0
  39. package/dist/commands/logs.d.ts +5 -0
  40. package/dist/commands/logs.d.ts.map +1 -0
  41. package/dist/commands/logs.js +117 -0
  42. package/dist/commands/logs.js.map +1 -0
  43. package/dist/commands/report.d.ts +6 -0
  44. package/dist/commands/report.d.ts.map +1 -0
  45. package/dist/commands/report.js +203 -0
  46. package/dist/commands/report.js.map +1 -0
  47. package/dist/commands/servers.d.ts +17 -0
  48. package/dist/commands/servers.d.ts.map +1 -0
  49. package/dist/commands/servers.js +116 -0
  50. package/dist/commands/servers.js.map +1 -0
  51. package/dist/commands/status.d.ts +5 -0
  52. package/dist/commands/status.d.ts.map +1 -0
  53. package/dist/commands/status.js +174 -0
  54. package/dist/commands/status.js.map +1 -0
  55. package/dist/commands/vms.d.ts +5 -0
  56. package/dist/commands/vms.d.ts.map +1 -0
  57. package/dist/commands/vms.js +83 -0
  58. package/dist/commands/vms.js.map +1 -0
  59. package/dist/config/crypto.d.ts +20 -0
  60. package/dist/config/crypto.d.ts.map +1 -0
  61. package/dist/config/crypto.js +78 -0
  62. package/dist/config/crypto.js.map +1 -0
  63. package/dist/config/index.d.ts +21 -0
  64. package/dist/config/index.d.ts.map +1 -0
  65. package/dist/config/index.js +158 -0
  66. package/dist/config/index.js.map +1 -0
  67. package/dist/config/types.d.ts +263 -0
  68. package/dist/config/types.d.ts.map +1 -0
  69. package/dist/config/types.js +83 -0
  70. package/dist/config/types.js.map +1 -0
  71. package/dist/globals.d.ts +22 -0
  72. package/dist/globals.d.ts.map +1 -0
  73. package/dist/globals.js +43 -0
  74. package/dist/globals.js.map +1 -0
  75. package/dist/index.d.ts +2 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +399 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/interactive/App.d.ts +3 -0
  80. package/dist/interactive/App.d.ts.map +1 -0
  81. package/dist/interactive/App.js +103 -0
  82. package/dist/interactive/App.js.map +1 -0
  83. package/dist/interactive/components/Header.d.ts +8 -0
  84. package/dist/interactive/components/Header.d.ts.map +1 -0
  85. package/dist/interactive/components/Header.js +20 -0
  86. package/dist/interactive/components/Header.js.map +1 -0
  87. package/dist/interactive/components/InputBar.d.ts +9 -0
  88. package/dist/interactive/components/InputBar.d.ts.map +1 -0
  89. package/dist/interactive/components/InputBar.js +89 -0
  90. package/dist/interactive/components/InputBar.js.map +1 -0
  91. package/dist/interactive/components/MessageList.d.ts +9 -0
  92. package/dist/interactive/components/MessageList.d.ts.map +1 -0
  93. package/dist/interactive/components/MessageList.js +28 -0
  94. package/dist/interactive/components/MessageList.js.map +1 -0
  95. package/dist/interactive/components/Spinner.d.ts +7 -0
  96. package/dist/interactive/components/Spinner.d.ts.map +1 -0
  97. package/dist/interactive/components/Spinner.js +19 -0
  98. package/dist/interactive/components/Spinner.js.map +1 -0
  99. package/dist/interactive/components/StatusBar.d.ts +10 -0
  100. package/dist/interactive/components/StatusBar.d.ts.map +1 -0
  101. package/dist/interactive/components/StatusBar.js +7 -0
  102. package/dist/interactive/components/StatusBar.js.map +1 -0
  103. package/dist/interactive/components/StreamingMessage.d.ts +7 -0
  104. package/dist/interactive/components/StreamingMessage.d.ts.map +1 -0
  105. package/dist/interactive/components/StreamingMessage.js +9 -0
  106. package/dist/interactive/components/StreamingMessage.js.map +1 -0
  107. package/dist/interactive/components/ToolIndicator.d.ts +7 -0
  108. package/dist/interactive/components/ToolIndicator.d.ts.map +1 -0
  109. package/dist/interactive/components/ToolIndicator.js +10 -0
  110. package/dist/interactive/components/ToolIndicator.js.map +1 -0
  111. package/dist/interactive/components/ToolOutput.d.ts +8 -0
  112. package/dist/interactive/components/ToolOutput.d.ts.map +1 -0
  113. package/dist/interactive/components/ToolOutput.js +9 -0
  114. package/dist/interactive/components/ToolOutput.js.map +1 -0
  115. package/dist/interactive/components/WelcomeScreen.d.ts +9 -0
  116. package/dist/interactive/components/WelcomeScreen.d.ts.map +1 -0
  117. package/dist/interactive/components/WelcomeScreen.js +8 -0
  118. package/dist/interactive/components/WelcomeScreen.js.map +1 -0
  119. package/dist/interactive/launch.d.ts +6 -0
  120. package/dist/interactive/launch.d.ts.map +1 -0
  121. package/dist/interactive/launch.js +30 -0
  122. package/dist/interactive/launch.js.map +1 -0
  123. package/dist/interactive/slashCommands.d.ts +13 -0
  124. package/dist/interactive/slashCommands.d.ts.map +1 -0
  125. package/dist/interactive/slashCommands.js +102 -0
  126. package/dist/interactive/slashCommands.js.map +1 -0
  127. package/dist/interactive/useRackMind.d.ts +30 -0
  128. package/dist/interactive/useRackMind.d.ts.map +1 -0
  129. package/dist/interactive/useRackMind.js +241 -0
  130. package/dist/interactive/useRackMind.js.map +1 -0
  131. package/dist/oneshot/run.d.ts +2 -0
  132. package/dist/oneshot/run.d.ts.map +1 -0
  133. package/dist/oneshot/run.js +195 -0
  134. package/dist/oneshot/run.js.map +1 -0
  135. package/dist/server/client.d.ts +89 -0
  136. package/dist/server/client.d.ts.map +1 -0
  137. package/dist/server/client.js +239 -0
  138. package/dist/server/client.js.map +1 -0
  139. package/dist/server/proxmox.d.ts +160 -0
  140. package/dist/server/proxmox.d.ts.map +1 -0
  141. package/dist/server/proxmox.js +219 -0
  142. package/dist/server/proxmox.js.map +1 -0
  143. package/dist/server/ssh.d.ts +80 -0
  144. package/dist/server/ssh.d.ts.map +1 -0
  145. package/dist/server/ssh.js +262 -0
  146. package/dist/server/ssh.js.map +1 -0
  147. package/dist/utils/ascii.d.ts +3 -0
  148. package/dist/utils/ascii.d.ts.map +1 -0
  149. package/dist/utils/ascii.js +16 -0
  150. package/dist/utils/ascii.js.map +1 -0
  151. package/dist/utils/format.d.ts +7 -0
  152. package/dist/utils/format.d.ts.map +1 -0
  153. package/dist/utils/format.js +20 -0
  154. package/dist/utils/format.js.map +1 -0
  155. package/dist/utils/history.d.ts +23 -0
  156. package/dist/utils/history.d.ts.map +1 -0
  157. package/dist/utils/history.js +107 -0
  158. package/dist/utils/history.js.map +1 -0
  159. package/dist/utils/logger.d.ts +9 -0
  160. package/dist/utils/logger.d.ts.map +1 -0
  161. package/dist/utils/logger.js +51 -0
  162. package/dist/utils/logger.js.map +1 -0
  163. package/dist/utils/markdown.d.ts +12 -0
  164. package/dist/utils/markdown.d.ts.map +1 -0
  165. package/dist/utils/markdown.js +76 -0
  166. package/dist/utils/markdown.js.map +1 -0
  167. package/dist/utils/prompt.d.ts +25 -0
  168. package/dist/utils/prompt.d.ts.map +1 -0
  169. package/dist/utils/prompt.js +133 -0
  170. package/dist/utils/prompt.js.map +1 -0
  171. package/dist/utils/retry.d.ts +37 -0
  172. package/dist/utils/retry.d.ts.map +1 -0
  173. package/dist/utils/retry.js +122 -0
  174. package/dist/utils/retry.js.map +1 -0
  175. package/dist/utils/shutdown.d.ts +22 -0
  176. package/dist/utils/shutdown.d.ts.map +1 -0
  177. package/dist/utils/shutdown.js +94 -0
  178. package/dist/utils/shutdown.js.map +1 -0
  179. package/dist/utils/table.d.ts +38 -0
  180. package/dist/utils/table.d.ts.map +1 -0
  181. package/dist/utils/table.js +150 -0
  182. package/dist/utils/table.js.map +1 -0
  183. package/package.json +71 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Main connect command handler.
3
+ * If the alias exists in config, switches to it.
4
+ * Otherwise, launches the interactive setup wizard.
5
+ */
6
+ export declare function connectCommand(alias: string): Promise<void>;
7
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjE"}
@@ -0,0 +1,117 @@
1
+ // ---------------------------------------------------------------------------
2
+ // rackmind connect <alias> — interactive server profile setup
3
+ // ---------------------------------------------------------------------------
4
+ // If the alias already exists, switches to it. Otherwise, runs the
5
+ // interactive setup wizard to create a new server profile.
6
+ // ---------------------------------------------------------------------------
7
+ import chalk from 'chalk';
8
+ import { getServerProfile, saveServerProfile, setActiveServer, encryptCredential, getDefaultServerProfile, } from '../config/index.js';
9
+ import { promptText, promptNumber, promptSecret, promptSelect, promptConfirm, } from '../utils/prompt.js';
10
+ import { formatError, formatSuccess, formatKeyValue } from '../utils/format.js';
11
+ import { logger } from '../utils/logger.js';
12
+ /**
13
+ * Main connect command handler.
14
+ * If the alias exists in config, switches to it.
15
+ * Otherwise, launches the interactive setup wizard.
16
+ */
17
+ export async function connectCommand(alias) {
18
+ const existing = getServerProfile(alias);
19
+ if (existing) {
20
+ // Server exists — switch to it
21
+ setActiveServer(alias);
22
+ process.stderr.write(formatSuccess(`Switched to server "${alias}" (${existing.host})\n`));
23
+ return;
24
+ }
25
+ // New server — run setup wizard
26
+ process.stderr.write(chalk.cyan.bold(`\nNew server profile: ${alias}\n`));
27
+ process.stderr.write(chalk.dim('Fill in the connection details below.\n\n'));
28
+ try {
29
+ const profile = await runSetupWizard(alias);
30
+ saveServerProfile(profile);
31
+ setActiveServer(alias);
32
+ process.stderr.write('\n');
33
+ process.stderr.write(formatSuccess(`Server "${alias}" saved and set as active.\n`));
34
+ process.stderr.write('\n');
35
+ printProfileSummary(profile);
36
+ }
37
+ catch (err) {
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ logger.error('Connect wizard failed', { error: message });
40
+ process.stderr.write(formatError(`Setup failed: ${message}\n`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ /**
45
+ * Interactive wizard that collects server details and returns a ServerProfile.
46
+ */
47
+ async function runSetupWizard(alias) {
48
+ // -- Platform selection --------------------------------------------------
49
+ const platform = await promptSelect('Server platform:', [
50
+ { label: 'Proxmox VE', value: 'proxmox' },
51
+ { label: 'Linux (SSH only)', value: 'linux' },
52
+ { label: 'Docker Host', value: 'docker' },
53
+ { label: 'Synology NAS', value: 'synology' },
54
+ ], 'proxmox');
55
+ // -- Host & port ---------------------------------------------------------
56
+ const host = await promptText('Host (IP or hostname)');
57
+ if (!host) {
58
+ throw new Error('Host is required');
59
+ }
60
+ const profile = getDefaultServerProfile(alias, host, platform);
61
+ // -- Proxmox-specific fields ---------------------------------------------
62
+ if (platform === 'proxmox') {
63
+ profile.port = await promptNumber('Proxmox API port', 8006);
64
+ profile.apiUser = await promptText('API user (e.g., root@pam)', 'root@pam');
65
+ profile.apiTokenId = await promptText('API token ID (e.g., root@pam!rackmind)', '');
66
+ const tokenSecret = await promptSecret('API token secret');
67
+ if (tokenSecret) {
68
+ profile.encryptedTokenSecret = encryptCredential(tokenSecret);
69
+ }
70
+ profile.node =
71
+ (await promptText('Node name (leave empty for auto-detect)', '')) || undefined;
72
+ profile.allowSelfSigned = await promptConfirm('Allow self-signed TLS certificates?', true);
73
+ }
74
+ // -- SSH connection ------------------------------------------------------
75
+ const configureSSH = platform !== 'proxmox' ? true : await promptConfirm('Configure SSH access?', true);
76
+ if (configureSSH) {
77
+ profile.sshHost = await promptText('SSH host', host);
78
+ profile.sshPort = await promptNumber('SSH port', 22);
79
+ profile.sshUsername = await promptText('SSH username', 'root');
80
+ const authType = await promptSelect('SSH auth method:', [
81
+ { label: 'Password', value: 'password' },
82
+ { label: 'Private key', value: 'key' },
83
+ ], 'password');
84
+ profile.sshAuthType = authType;
85
+ if (authType === 'password') {
86
+ const sshPassword = await promptSecret('SSH password');
87
+ if (sshPassword) {
88
+ profile.encryptedSshPassword = encryptCredential(sshPassword);
89
+ }
90
+ }
91
+ else {
92
+ profile.sshPrivateKeyPath = await promptText('Path to private key', '~/.ssh/id_rsa');
93
+ }
94
+ }
95
+ return profile;
96
+ }
97
+ /**
98
+ * Print a summary of the saved profile (masking sensitive values).
99
+ */
100
+ function printProfileSummary(profile) {
101
+ process.stderr.write(chalk.dim('--- Profile Summary ---\n'));
102
+ process.stderr.write(formatKeyValue(' Alias', profile.alias) + '\n');
103
+ process.stderr.write(formatKeyValue(' Platform', profile.platform) + '\n');
104
+ process.stderr.write(formatKeyValue(' Host', profile.host) + '\n');
105
+ if (profile.platform === 'proxmox') {
106
+ process.stderr.write(formatKeyValue(' API Port', String(profile.port)) + '\n');
107
+ process.stderr.write(formatKeyValue(' API User', profile.apiUser) + '\n');
108
+ process.stderr.write(formatKeyValue(' Token ID', profile.apiTokenId || chalk.dim('(none)')) + '\n');
109
+ process.stderr.write(formatKeyValue(' Token Secret', profile.encryptedTokenSecret ? chalk.green('(encrypted)') : chalk.dim('(none)')) + '\n');
110
+ }
111
+ if (profile.sshHost) {
112
+ process.stderr.write(formatKeyValue(' SSH', `${profile.sshUsername}@${profile.sshHost}:${profile.sshPort}`) + '\n');
113
+ process.stderr.write(formatKeyValue(' SSH Auth', profile.sshAuthType) + '\n');
114
+ }
115
+ process.stderr.write(chalk.dim('----------------------\n'));
116
+ }
117
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * List all LXC containers on the active server.
3
+ */
4
+ export declare function containersCommand(json: boolean): Promise<void>;
5
+ //# sourceMappingURL=containers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../src/commands/containers.ts"],"names":[],"mappings":"AAuDA;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DpE"}
@@ -0,0 +1,83 @@
1
+ // ---------------------------------------------------------------------------
2
+ // rackmind containers (alias: ct) — list all LXC containers
3
+ // ---------------------------------------------------------------------------
4
+ // Fetches containers from Proxmox API and displays them in a formatted table.
5
+ // Supports --json for machine-readable output.
6
+ // ---------------------------------------------------------------------------
7
+ import chalk from 'chalk';
8
+ import { ServerClient } from '../server/client.js';
9
+ import { createTable, formatBytes, formatPercent, formatUptime, colorStatus, truncate, } from '../utils/table.js';
10
+ import { formatError } from '../utils/format.js';
11
+ import { logger } from '../utils/logger.js';
12
+ function toContainerRow(ct) {
13
+ return {
14
+ vmid: ct.vmid,
15
+ name: ct.name,
16
+ status: ct.status,
17
+ cpus: ct.cpus,
18
+ memUsed: ct.mem,
19
+ memMax: ct.maxmem,
20
+ memPercent: ct.maxmem > 0 ? ct.mem / ct.maxmem : 0,
21
+ diskUsed: ct.disk,
22
+ diskMax: ct.maxdisk,
23
+ diskPercent: ct.maxdisk > 0 ? ct.disk / ct.maxdisk : 0,
24
+ uptime: ct.uptime,
25
+ netIn: ct.netin,
26
+ netOut: ct.netout,
27
+ };
28
+ }
29
+ /**
30
+ * List all LXC containers on the active server.
31
+ */
32
+ export async function containersCommand(json) {
33
+ let client = null;
34
+ try {
35
+ client = ServerClient.fromActiveProfile();
36
+ }
37
+ catch (err) {
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ process.stderr.write(formatError(message) + '\n');
40
+ process.exit(1);
41
+ }
42
+ try {
43
+ const node = await client.getNodeName();
44
+ const containers = await client.listContainers(node);
45
+ // Sort by VMID
46
+ containers.sort((a, b) => a.vmid - b.vmid);
47
+ if (json) {
48
+ const rows = containers.map(toContainerRow);
49
+ process.stdout.write(JSON.stringify(rows, null, 2) + '\n');
50
+ return;
51
+ }
52
+ if (containers.length === 0) {
53
+ process.stderr.write(chalk.dim('No LXC containers found.\n'));
54
+ return;
55
+ }
56
+ process.stderr.write(chalk.cyan.bold(`\nLXC Containers`) + chalk.dim(` (${containers.length})\n\n`));
57
+ const table = createTable(['VMID', 'Name', 'Status', 'CPUs', 'Memory', 'Disk', 'Uptime']);
58
+ for (const ct of containers) {
59
+ const memRatio = ct.maxmem > 0 ? ct.mem / ct.maxmem : 0;
60
+ const diskRatio = ct.maxdisk > 0 ? ct.disk / ct.maxdisk : 0;
61
+ table.push([
62
+ String(ct.vmid),
63
+ truncate(ct.name || chalk.dim('(unnamed)'), 24),
64
+ colorStatus(ct.status),
65
+ String(ct.cpus),
66
+ `${formatBytes(ct.mem)} / ${formatBytes(ct.maxmem)} ${formatPercent(memRatio)}`,
67
+ `${formatBytes(ct.disk)} / ${formatBytes(ct.maxdisk)} ${formatPercent(diskRatio)}`,
68
+ formatUptime(ct.uptime),
69
+ ]);
70
+ }
71
+ process.stderr.write(table.toString() + '\n\n');
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ logger.error('Containers command failed', { error: message });
76
+ process.stderr.write(formatError(message) + '\n');
77
+ process.exit(1);
78
+ }
79
+ finally {
80
+ client.dispose();
81
+ }
82
+ }
83
+ //# sourceMappingURL=containers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.js","sourceRoot":"","sources":["../../src/commands/containers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Execute a command on the active server (host or container).
3
+ */
4
+ export declare function execCommand(cmd: string, target?: string): Promise<void>;
5
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G7E"}
@@ -0,0 +1,133 @@
1
+ // ---------------------------------------------------------------------------
2
+ // rackmind exec "<cmd>" --target=<vmid|host> — execute commands via SSH
3
+ // ---------------------------------------------------------------------------
4
+ // Executes a command on the Proxmox host or inside an LXC container.
5
+ //
6
+ // Usage:
7
+ // rackmind exec "uptime" — run on the Proxmox host
8
+ // rackmind exec "apt update" --target=106 — run inside LXC container 106
9
+ // rackmind exec "hostname" --target=host — explicitly target the host
10
+ // ---------------------------------------------------------------------------
11
+ import chalk from 'chalk';
12
+ import { ServerClient } from '../server/client.js';
13
+ import { formatError, formatDim } from '../utils/format.js';
14
+ import { logger } from '../utils/logger.js';
15
+ import { isQuietMode, isJsonMode } from '../globals.js';
16
+ /**
17
+ * Execute a command on the active server (host or container).
18
+ */
19
+ export async function execCommand(cmd, target) {
20
+ let client = null;
21
+ try {
22
+ client = ServerClient.fromActiveProfile();
23
+ }
24
+ catch (err) {
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ process.stderr.write(formatError(message) + '\n');
27
+ process.exit(1);
28
+ }
29
+ try {
30
+ // Determine if targeting a container (numeric vmid) or the host
31
+ const vmid = parseTarget(target);
32
+ const quiet = isQuietMode();
33
+ const jsonMode = isJsonMode();
34
+ // In JSON mode, collect output instead of streaming
35
+ let collectedStdout = '';
36
+ let collectedStderr = '';
37
+ const streamHandler = jsonMode
38
+ ? (data, stream) => {
39
+ if (stream === 'stdout') {
40
+ collectedStdout += data;
41
+ }
42
+ else {
43
+ collectedStderr += data;
44
+ }
45
+ }
46
+ : (data, stream) => {
47
+ if (stream === 'stdout') {
48
+ process.stdout.write(data);
49
+ }
50
+ else {
51
+ process.stderr.write(data);
52
+ }
53
+ };
54
+ if (vmid !== null) {
55
+ // Execute inside LXC container
56
+ if (!quiet && !jsonMode) {
57
+ process.stderr.write(formatDim(`Executing on container ${vmid}: ${cmd}\n`) +
58
+ chalk.dim('─'.repeat(50) + '\n'));
59
+ }
60
+ const exitCode = await client.execInContainerStream(vmid, cmd, streamHandler);
61
+ if (!quiet && !jsonMode) {
62
+ process.stderr.write(chalk.dim('─'.repeat(50) + '\n'));
63
+ }
64
+ if (jsonMode) {
65
+ const output = {
66
+ target: `container:${vmid}`,
67
+ command: cmd,
68
+ exitCode: exitCode ?? 0,
69
+ stdout: collectedStdout,
70
+ stderr: collectedStderr,
71
+ };
72
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
73
+ }
74
+ if (exitCode !== null && exitCode !== 0) {
75
+ if (!quiet && !jsonMode) {
76
+ process.stderr.write(formatDim(`Exit code: ${exitCode}\n`));
77
+ }
78
+ process.exit(exitCode);
79
+ }
80
+ }
81
+ else {
82
+ // Execute on the Proxmox host
83
+ if (!quiet && !jsonMode) {
84
+ process.stderr.write(formatDim(`Executing on host: ${cmd}\n`) + chalk.dim('─'.repeat(50) + '\n'));
85
+ }
86
+ const exitCode = await client.execOnHostStream(cmd, streamHandler);
87
+ if (!quiet && !jsonMode) {
88
+ process.stderr.write(chalk.dim('─'.repeat(50) + '\n'));
89
+ }
90
+ if (jsonMode) {
91
+ const output = {
92
+ target: 'host',
93
+ command: cmd,
94
+ exitCode: exitCode ?? 0,
95
+ stdout: collectedStdout,
96
+ stderr: collectedStderr,
97
+ };
98
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
99
+ }
100
+ if (exitCode !== null && exitCode !== 0) {
101
+ if (!quiet && !jsonMode) {
102
+ process.stderr.write(formatDim(`Exit code: ${exitCode}\n`));
103
+ }
104
+ process.exit(exitCode);
105
+ }
106
+ }
107
+ }
108
+ catch (err) {
109
+ const message = err instanceof Error ? err.message : String(err);
110
+ logger.error('Exec command failed', { error: message });
111
+ process.stderr.write(formatError(message) + '\n');
112
+ process.exit(1);
113
+ }
114
+ finally {
115
+ client.dispose();
116
+ }
117
+ }
118
+ /**
119
+ * Parse the --target flag.
120
+ * Returns a numeric VMID if the target is a number, or null for host execution.
121
+ * "host" explicitly targets the Proxmox host.
122
+ */
123
+ function parseTarget(target) {
124
+ if (!target || target === 'host') {
125
+ return null;
126
+ }
127
+ const vmid = parseInt(target, 10);
128
+ if (isNaN(vmid) || vmid <= 0) {
129
+ throw new Error(`Invalid target "${target}" — expected a numeric VMID (e.g., 106) or "host"`);
130
+ }
131
+ return vmid;
132
+ }
133
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAC9E,qEAAqE;AACrE,EAAE;AACF,SAAS;AACT,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,MAAe;IAC1D,IAAI,MAAM,GAAwB,IAAI,CAAC;IAEvC,IAAI,CAAC;QACD,MAAM,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACD,gEAAgE;QAChE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;QAE9B,oDAAoD;QACpD,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,eAAe,GAAG,EAAE,CAAC;QAEzB,MAAM,aAAa,GAAG,QAAQ;YAC1B,CAAC,CAAC,CAAC,IAAY,EAAE,MAA2B,EAAE,EAAE;gBAC1C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtB,eAAe,IAAI,IAAI,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,eAAe,IAAI,IAAI,CAAC;gBAC5B,CAAC;YACL,CAAC;YACH,CAAC,CAAC,CAAC,IAAY,EAAE,MAA2B,EAAE,EAAE;gBAC1C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC,CAAC;QAER,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,+BAA+B;YAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,SAAS,CAAC,0BAA0B,IAAI,KAAK,GAAG,IAAI,CAAC;oBACjD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CACvC,CAAC;YACN,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YAE9E,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG;oBACX,MAAM,EAAE,aAAa,IAAI,EAAE;oBAC3B,OAAO,EAAE,GAAG;oBACZ,QAAQ,EAAE,QAAQ,IAAI,CAAC;oBACvB,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE,eAAe;iBAC1B,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,8BAA8B;YAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAC9E,CAAC;YACN,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAEnE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG;oBACX,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,GAAG;oBACZ,QAAQ,EAAE,QAAQ,IAAI,CAAC;oBACvB,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE,eAAe;iBAC1B,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;YAAS,CAAC;QACP,MAAM,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,MAAe;IAChC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACX,mBAAmB,MAAM,mDAAmD,CAC/E,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ type LifecycleAction = 'start' | 'stop' | 'restart';
2
+ /**
3
+ * Perform a lifecycle action on a guest (container or VM).
4
+ */
5
+ export declare function lifecycleCommand(vmidStr: string, action: LifecycleAction, force: boolean): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAiBA,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAUpD;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAgHf"}
@@ -0,0 +1,213 @@
1
+ // ---------------------------------------------------------------------------
2
+ // rackmind start/stop/restart <vmid> — guest lifecycle commands
3
+ // ---------------------------------------------------------------------------
4
+ // Auto-detects whether the VMID is an LXC container or QEMU VM, then
5
+ // performs the requested action. Destructive operations (stop, restart)
6
+ // require confirmation unless --force is passed.
7
+ // ---------------------------------------------------------------------------
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import { ServerClient } from '../server/client.js';
11
+ import { readConfig } from '../config/index.js';
12
+ import { formatError, formatSuccess, formatWarning } from '../utils/format.js';
13
+ import { promptConfirm } from '../utils/prompt.js';
14
+ import { logger } from '../utils/logger.js';
15
+ import { isQuietMode, isJsonMode } from '../globals.js';
16
+ /**
17
+ * Perform a lifecycle action on a guest (container or VM).
18
+ */
19
+ export async function lifecycleCommand(vmidStr, action, force) {
20
+ const vmid = parseInt(vmidStr, 10);
21
+ if (isNaN(vmid) || vmid <= 0) {
22
+ process.stderr.write(formatError(`Invalid VMID: "${vmidStr}" — must be a positive number`) + '\n');
23
+ process.exit(1);
24
+ }
25
+ let client = null;
26
+ try {
27
+ client = ServerClient.fromActiveProfile();
28
+ }
29
+ catch (err) {
30
+ const message = err instanceof Error ? err.message : String(err);
31
+ process.stderr.write(formatError(message) + '\n');
32
+ process.exit(1);
33
+ }
34
+ try {
35
+ // Auto-detect guest type
36
+ const guest = await detectGuestType(client, vmid);
37
+ if (!guest) {
38
+ process.stderr.write(formatError(`VMID ${vmid} not found as either an LXC container or QEMU VM`) + '\n');
39
+ process.exit(1);
40
+ }
41
+ // Validate action makes sense for current state
42
+ const stateError = validateState(guest, action);
43
+ if (stateError) {
44
+ process.stderr.write(formatWarning(stateError) + '\n');
45
+ return;
46
+ }
47
+ // Confirm destructive actions
48
+ if (!force && (action === 'stop' || action === 'restart')) {
49
+ const config = readConfig();
50
+ if (config.preferences.confirmDestructive) {
51
+ const typeLabel = guest.type === 'lxc' ? 'container' : 'VM';
52
+ const nameLabel = guest.name ? ` (${guest.name})` : '';
53
+ const confirmed = await promptConfirm(chalk.yellow(`This will ${action} ${typeLabel} ${vmid}${nameLabel}. Are you sure?`), false);
54
+ if (!confirmed) {
55
+ process.stderr.write(chalk.dim('Cancelled.\n'));
56
+ return;
57
+ }
58
+ }
59
+ }
60
+ // Perform the action
61
+ const typeLabel = guest.type === 'lxc' ? 'Container' : 'VM';
62
+ const actionLabel = action === 'start' ? 'Starting' : action === 'stop' ? 'Stopping' : 'Restarting';
63
+ const quiet = isQuietMode();
64
+ const jsonMode = isJsonMode();
65
+ const spinner = quiet ? null : ora(`${actionLabel} ${typeLabel} ${vmid}...`).start();
66
+ try {
67
+ await performAction(client, guest, action);
68
+ const pastTense = action === 'start' ? 'started' : action === 'stop' ? 'stopped' : 'restarted';
69
+ if (jsonMode) {
70
+ const output = {
71
+ vmid,
72
+ type: guest.type,
73
+ name: guest.name,
74
+ action,
75
+ success: true,
76
+ };
77
+ if (spinner)
78
+ spinner.stop();
79
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
80
+ }
81
+ else if (spinner) {
82
+ spinner.succeed(formatSuccess(`${typeLabel} ${vmid} ${pastTense} successfully`));
83
+ }
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ if (jsonMode) {
88
+ const output = {
89
+ vmid,
90
+ type: guest.type,
91
+ name: guest.name,
92
+ action,
93
+ success: false,
94
+ error: message,
95
+ };
96
+ if (spinner)
97
+ spinner.stop();
98
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
99
+ }
100
+ else if (spinner) {
101
+ spinner.fail(`Failed to ${action} ${typeLabel} ${vmid}`);
102
+ }
103
+ if (!jsonMode) {
104
+ process.stderr.write(formatError(message) + '\n');
105
+ }
106
+ process.exit(1);
107
+ }
108
+ }
109
+ catch (err) {
110
+ const message = err instanceof Error ? err.message : String(err);
111
+ logger.error('Lifecycle command failed', { error: message, vmid, action });
112
+ process.stderr.write(formatError(message) + '\n');
113
+ process.exit(1);
114
+ }
115
+ finally {
116
+ client.dispose();
117
+ }
118
+ }
119
+ /**
120
+ * Detect whether a VMID belongs to an LXC container or QEMU VM.
121
+ * Tries containers first, then VMs.
122
+ */
123
+ async function detectGuestType(client, vmid) {
124
+ const node = await client.getNodeName();
125
+ // Try containers first
126
+ try {
127
+ const containers = await client.listContainers(node);
128
+ const container = containers.find((ct) => ct.vmid === vmid);
129
+ if (container) {
130
+ return {
131
+ vmid: container.vmid,
132
+ name: container.name,
133
+ type: 'lxc',
134
+ status: container.status,
135
+ };
136
+ }
137
+ }
138
+ catch (err) {
139
+ logger.debug('Failed to check containers for VMID', {
140
+ vmid,
141
+ error: err instanceof Error ? err.message : String(err),
142
+ });
143
+ }
144
+ // Try VMs
145
+ try {
146
+ const vms = await client.listVMs(node);
147
+ const vm = vms.find((v) => v.vmid === vmid);
148
+ if (vm) {
149
+ return {
150
+ vmid: vm.vmid,
151
+ name: vm.name,
152
+ type: 'qemu',
153
+ status: vm.status,
154
+ };
155
+ }
156
+ }
157
+ catch (err) {
158
+ logger.debug('Failed to check VMs for VMID', {
159
+ vmid,
160
+ error: err instanceof Error ? err.message : String(err),
161
+ });
162
+ }
163
+ return null;
164
+ }
165
+ /**
166
+ * Validate that the requested action makes sense for the guest's current state.
167
+ * Returns an error message if invalid, or null if the action is valid.
168
+ */
169
+ function validateState(guest, action) {
170
+ const typeLabel = guest.type === 'lxc' ? 'Container' : 'VM';
171
+ if (action === 'start' && guest.status === 'running') {
172
+ return `${typeLabel} ${guest.vmid} is already running.`;
173
+ }
174
+ if (action === 'stop' && guest.status === 'stopped') {
175
+ return `${typeLabel} ${guest.vmid} is already stopped.`;
176
+ }
177
+ if (action === 'restart' && guest.status === 'stopped') {
178
+ return `${typeLabel} ${guest.vmid} is stopped — use "start" instead.`;
179
+ }
180
+ return null;
181
+ }
182
+ /**
183
+ * Perform the lifecycle action on the Proxmox guest.
184
+ */
185
+ async function performAction(client, guest, action) {
186
+ if (guest.type === 'lxc') {
187
+ switch (action) {
188
+ case 'start':
189
+ await client.startContainer(guest.vmid);
190
+ break;
191
+ case 'stop':
192
+ await client.stopContainer(guest.vmid);
193
+ break;
194
+ case 'restart':
195
+ await client.restartContainer(guest.vmid);
196
+ break;
197
+ }
198
+ }
199
+ else {
200
+ switch (action) {
201
+ case 'start':
202
+ await client.startVM(guest.vmid);
203
+ break;
204
+ case 'stop':
205
+ await client.stopVM(guest.vmid);
206
+ break;
207
+ case 'restart':
208
+ await client.restartVM(guest.vmid);
209
+ break;
210
+ }
211
+ }
212
+ }
213
+ //# sourceMappingURL=lifecycle.js.map