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,239 @@
1
+ // ---------------------------------------------------------------------------
2
+ // ServerClient — unified facade over Proxmox API + SSH
3
+ // ---------------------------------------------------------------------------
4
+ // Combines ProxmoxClient (REST API) and SSHConnection into a single interface.
5
+ // Uses the active server profile's decrypted credentials to initialize both.
6
+ // ---------------------------------------------------------------------------
7
+ import { ProxmoxClient, } from './proxmox.js';
8
+ import { SSHConnection } from './ssh.js';
9
+ import { getActiveProfile, decryptCredential } from '../config/index.js';
10
+ import { logger } from '../utils/logger.js';
11
+ // ---------------------------------------------------------------------------
12
+ // ServerClient
13
+ // ---------------------------------------------------------------------------
14
+ export class ServerClient {
15
+ profile;
16
+ proxmox;
17
+ ssh;
18
+ resolvedNode = null;
19
+ constructor(profile) {
20
+ this.profile = profile;
21
+ // Initialize Proxmox API client
22
+ const tokenSecret = profile.encryptedTokenSecret
23
+ ? decryptCredential(profile.encryptedTokenSecret)
24
+ : '';
25
+ this.proxmox = new ProxmoxClient({
26
+ host: profile.host,
27
+ port: profile.port,
28
+ apiTokenId: profile.apiTokenId,
29
+ apiTokenSecret: tokenSecret,
30
+ allowSelfSigned: profile.allowSelfSigned,
31
+ });
32
+ // Initialize SSH client
33
+ const sshPassword = profile.encryptedSshPassword
34
+ ? decryptCredential(profile.encryptedSshPassword)
35
+ : undefined;
36
+ this.ssh = new SSHConnection({
37
+ host: profile.sshHost || profile.host,
38
+ port: profile.sshPort,
39
+ username: profile.sshUsername,
40
+ authType: profile.sshAuthType,
41
+ password: sshPassword,
42
+ privateKeyPath: profile.sshPrivateKeyPath || undefined,
43
+ });
44
+ logger.info('ServerClient initialized', { alias: profile.alias });
45
+ }
46
+ /**
47
+ * Create a ServerClient from the active server profile in config.
48
+ * Throws if no active server is configured.
49
+ */
50
+ static fromActiveProfile() {
51
+ const profile = getActiveProfile();
52
+ if (!profile) {
53
+ throw new Error('No active server configured. Run `rackmind connect <alias>` to set one up.');
54
+ }
55
+ return new ServerClient(profile);
56
+ }
57
+ // -----------------------------------------------------------------------
58
+ // Connection lifecycle
59
+ // -----------------------------------------------------------------------
60
+ /** Connect SSH (Proxmox API is stateless, no connect needed) */
61
+ async connectSSH() {
62
+ await this.ssh.connect();
63
+ }
64
+ /** Disconnect SSH */
65
+ disconnectSSH() {
66
+ this.ssh.disconnect();
67
+ }
68
+ /** Test all connections and return status */
69
+ async getStatus() {
70
+ const status = {
71
+ apiConnected: false,
72
+ sshConnected: false,
73
+ proxmoxVersion: null,
74
+ sshHostname: null,
75
+ serverAlias: this.profile.alias,
76
+ apiUrl: `https://${this.profile.host}:${this.profile.port}`,
77
+ node: this.resolvedNode,
78
+ errors: [],
79
+ };
80
+ // Test Proxmox API
81
+ try {
82
+ status.proxmoxVersion = await this.proxmox.testConnection();
83
+ status.apiConnected = true;
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ status.errors.push(`API: ${message}`);
88
+ logger.warn('Proxmox API connection test failed', { error: message });
89
+ }
90
+ // Test SSH
91
+ try {
92
+ if (!this.ssh.isConnected()) {
93
+ await this.ssh.connect();
94
+ }
95
+ status.sshHostname = await this.ssh.testConnection();
96
+ status.sshConnected = true;
97
+ }
98
+ catch (err) {
99
+ const message = err instanceof Error ? err.message : String(err);
100
+ status.errors.push(`SSH: ${message}`);
101
+ logger.warn('SSH connection test failed', { error: message });
102
+ }
103
+ return status;
104
+ }
105
+ // -----------------------------------------------------------------------
106
+ // Node management
107
+ // -----------------------------------------------------------------------
108
+ /**
109
+ * Get the node name to use for API calls.
110
+ * Uses the profile's configured node, or auto-detects from the API.
111
+ */
112
+ async getNodeName() {
113
+ if (this.resolvedNode)
114
+ return this.resolvedNode;
115
+ if (this.profile.node) {
116
+ this.resolvedNode = this.profile.node;
117
+ return this.resolvedNode;
118
+ }
119
+ // Auto-detect from API
120
+ this.resolvedNode = await this.proxmox.detectNodeName();
121
+ logger.info('Auto-detected node name', { node: this.resolvedNode });
122
+ return this.resolvedNode;
123
+ }
124
+ /** List all nodes in the cluster */
125
+ async listNodes() {
126
+ return await this.proxmox.listNodes();
127
+ }
128
+ /** Get status of a specific node */
129
+ async getNodeStatus(node) {
130
+ const nodeName = node ?? (await this.getNodeName());
131
+ return this.proxmox.getNodeStatus(nodeName);
132
+ }
133
+ // -----------------------------------------------------------------------
134
+ // Containers (LXC)
135
+ // -----------------------------------------------------------------------
136
+ /** List all LXC containers on the active node */
137
+ async listContainers(node) {
138
+ const nodeName = node ?? (await this.getNodeName());
139
+ return this.proxmox.listContainers(nodeName);
140
+ }
141
+ /** Get status of an LXC container */
142
+ async getContainerStatus(vmid, node) {
143
+ const nodeName = node ?? (await this.getNodeName());
144
+ return this.proxmox.getContainerStatus(nodeName, vmid);
145
+ }
146
+ /** Get configuration of an LXC container */
147
+ async getContainerConfig(vmid, node) {
148
+ const nodeName = node ?? (await this.getNodeName());
149
+ return this.proxmox.getContainerConfig(nodeName, vmid);
150
+ }
151
+ /** Start an LXC container */
152
+ async startContainer(vmid, node) {
153
+ const nodeName = node ?? (await this.getNodeName());
154
+ return this.proxmox.startContainer(nodeName, vmid);
155
+ }
156
+ /** Stop an LXC container */
157
+ async stopContainer(vmid, node) {
158
+ const nodeName = node ?? (await this.getNodeName());
159
+ return this.proxmox.stopContainer(nodeName, vmid);
160
+ }
161
+ /** Restart an LXC container */
162
+ async restartContainer(vmid, node) {
163
+ const nodeName = node ?? (await this.getNodeName());
164
+ return this.proxmox.restartContainer(nodeName, vmid);
165
+ }
166
+ // -----------------------------------------------------------------------
167
+ // Virtual Machines (QEMU)
168
+ // -----------------------------------------------------------------------
169
+ /** List all QEMU VMs on the active node */
170
+ async listVMs(node) {
171
+ const nodeName = node ?? (await this.getNodeName());
172
+ return this.proxmox.listVMs(nodeName);
173
+ }
174
+ /** Get status of a QEMU VM */
175
+ async getVMStatus(vmid, node) {
176
+ const nodeName = node ?? (await this.getNodeName());
177
+ return this.proxmox.getVMStatus(nodeName, vmid);
178
+ }
179
+ /** Get configuration of a QEMU VM */
180
+ async getVMConfig(vmid, node) {
181
+ const nodeName = node ?? (await this.getNodeName());
182
+ return this.proxmox.getVMConfig(nodeName, vmid);
183
+ }
184
+ /** Start a QEMU VM */
185
+ async startVM(vmid, node) {
186
+ const nodeName = node ?? (await this.getNodeName());
187
+ return this.proxmox.startVM(nodeName, vmid);
188
+ }
189
+ /** Stop a QEMU VM */
190
+ async stopVM(vmid, node) {
191
+ const nodeName = node ?? (await this.getNodeName());
192
+ return this.proxmox.stopVM(nodeName, vmid);
193
+ }
194
+ /** Restart a QEMU VM */
195
+ async restartVM(vmid, node) {
196
+ const nodeName = node ?? (await this.getNodeName());
197
+ return this.proxmox.restartVM(nodeName, vmid);
198
+ }
199
+ // -----------------------------------------------------------------------
200
+ // Cluster resources
201
+ // -----------------------------------------------------------------------
202
+ /** Get all resources across the cluster */
203
+ async listResources(type) {
204
+ return await this.proxmox.listResources(type);
205
+ }
206
+ // -----------------------------------------------------------------------
207
+ // SSH command execution
208
+ // -----------------------------------------------------------------------
209
+ /** Execute a command on the Proxmox host via SSH (auto-reconnects) */
210
+ async execOnHost(command) {
211
+ await this.ssh.ensureConnectedOrReconnect();
212
+ return this.ssh.exec(command);
213
+ }
214
+ /** Execute a command on the Proxmox host with streaming output (auto-reconnects) */
215
+ async execOnHostStream(command, onData) {
216
+ await this.ssh.ensureConnectedOrReconnect();
217
+ return this.ssh.execStream(command, onData);
218
+ }
219
+ /** Execute a command inside an LXC container via SSH + pct exec (auto-reconnects) */
220
+ async execInContainer(vmid, command) {
221
+ await this.ssh.ensureConnectedOrReconnect();
222
+ return this.ssh.execInContainer(vmid, command);
223
+ }
224
+ /** Execute a command inside an LXC container with streaming output (auto-reconnects) */
225
+ async execInContainerStream(vmid, command, onData) {
226
+ await this.ssh.ensureConnectedOrReconnect();
227
+ return this.ssh.execInContainerStream(vmid, command, onData);
228
+ }
229
+ /** Clean up all connections */
230
+ dispose() {
231
+ this.disconnectSSH();
232
+ }
233
+ }
234
+ // ---------------------------------------------------------------------------
235
+ // Re-exports for convenience
236
+ // ---------------------------------------------------------------------------
237
+ export { ProxmoxClient, ProxmoxApiError } from './proxmox.js';
238
+ export { SSHConnection, SSHConnectionError } from './ssh.js';
239
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/server/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /** Node summary from GET /api2/json/nodes */
2
+ export interface ProxmoxNode {
3
+ node: string;
4
+ status: string;
5
+ cpu: number;
6
+ maxcpu: number;
7
+ mem: number;
8
+ maxmem: number;
9
+ disk: number;
10
+ maxdisk: number;
11
+ uptime: number;
12
+ type: string;
13
+ id: string;
14
+ }
15
+ /** LXC container summary from GET /api2/json/nodes/{node}/lxc */
16
+ export interface ProxmoxContainer {
17
+ vmid: number;
18
+ name: string;
19
+ status: string;
20
+ type: string;
21
+ cpus: number;
22
+ mem: number;
23
+ maxmem: number;
24
+ disk: number;
25
+ maxdisk: number;
26
+ uptime: number;
27
+ netin: number;
28
+ netout: number;
29
+ }
30
+ /** QEMU VM summary from GET /api2/json/nodes/{node}/qemu */
31
+ export interface ProxmoxVM {
32
+ vmid: number;
33
+ name: string;
34
+ status: string;
35
+ cpus: number;
36
+ mem: number;
37
+ maxmem: number;
38
+ disk: number;
39
+ maxdisk: number;
40
+ uptime: number;
41
+ netin: number;
42
+ netout: number;
43
+ pid?: number;
44
+ }
45
+ /** VM/Container config (subset of common fields) */
46
+ export interface ProxmoxGuestConfig {
47
+ name?: string;
48
+ description?: string;
49
+ cores?: number;
50
+ memory?: number;
51
+ ostype?: string;
52
+ net0?: string;
53
+ rootfs?: string;
54
+ [key: string]: unknown;
55
+ }
56
+ /** VM/Container current status */
57
+ export interface ProxmoxGuestStatus {
58
+ status: string;
59
+ vmid: number;
60
+ name: string;
61
+ cpus: number;
62
+ mem: number;
63
+ maxmem: number;
64
+ disk: number;
65
+ maxdisk: number;
66
+ uptime: number;
67
+ cpu: number;
68
+ netin: number;
69
+ netout: number;
70
+ pid?: number;
71
+ }
72
+ /** Resource usage entry from GET /api2/json/cluster/resources */
73
+ export interface ProxmoxResource {
74
+ id: string;
75
+ type: string;
76
+ node: string;
77
+ status: string;
78
+ vmid?: number;
79
+ name?: string;
80
+ cpu?: number;
81
+ maxcpu?: number;
82
+ mem?: number;
83
+ maxmem?: number;
84
+ disk?: number;
85
+ maxdisk?: number;
86
+ uptime?: number;
87
+ }
88
+ /** Proxmox version info from GET /api2/json/version */
89
+ export interface ProxmoxVersion {
90
+ version: string;
91
+ release: string;
92
+ repoid: string;
93
+ }
94
+ export interface ProxmoxClientOptions {
95
+ /** Proxmox host (IP or hostname) */
96
+ host: string;
97
+ /** Proxmox API port (default: 8006) */
98
+ port: number;
99
+ /** API token ID (e.g., root@pam!rackmind) */
100
+ apiTokenId: string;
101
+ /** API token secret (decrypted) */
102
+ apiTokenSecret: string;
103
+ /** Allow self-signed TLS certificates (default: true) */
104
+ allowSelfSigned?: boolean;
105
+ }
106
+ export declare class ProxmoxClient {
107
+ private readonly baseUrl;
108
+ private readonly authHeader;
109
+ private readonly allowSelfSigned;
110
+ constructor(options: ProxmoxClientOptions);
111
+ private buildFetchOptions;
112
+ private request;
113
+ get<T>(path: string): Promise<T>;
114
+ post<T>(path: string, body?: Record<string, unknown>): Promise<T>;
115
+ put<T>(path: string, body?: Record<string, unknown>): Promise<T>;
116
+ del<T>(path: string): Promise<T>;
117
+ /** Test the connection by fetching the Proxmox version */
118
+ testConnection(): Promise<ProxmoxVersion>;
119
+ /** List all nodes in the cluster */
120
+ listNodes(): Promise<ProxmoxNode[]>;
121
+ /** Get status of a specific node */
122
+ getNodeStatus(node: string): Promise<ProxmoxNode>;
123
+ /** List all LXC containers on a node */
124
+ listContainers(node: string): Promise<ProxmoxContainer[]>;
125
+ /** Get current status of an LXC container */
126
+ getContainerStatus(node: string, vmid: number): Promise<ProxmoxGuestStatus>;
127
+ /** Get configuration of an LXC container */
128
+ getContainerConfig(node: string, vmid: number): Promise<ProxmoxGuestConfig>;
129
+ /** Start an LXC container */
130
+ startContainer(node: string, vmid: number): Promise<string>;
131
+ /** Stop an LXC container */
132
+ stopContainer(node: string, vmid: number): Promise<string>;
133
+ /** Restart (reboot) an LXC container */
134
+ restartContainer(node: string, vmid: number): Promise<string>;
135
+ /** List all QEMU VMs on a node */
136
+ listVMs(node: string): Promise<ProxmoxVM[]>;
137
+ /** Get current status of a QEMU VM */
138
+ getVMStatus(node: string, vmid: number): Promise<ProxmoxGuestStatus>;
139
+ /** Get configuration of a QEMU VM */
140
+ getVMConfig(node: string, vmid: number): Promise<ProxmoxGuestConfig>;
141
+ /** Start a QEMU VM */
142
+ startVM(node: string, vmid: number): Promise<string>;
143
+ /** Stop a QEMU VM */
144
+ stopVM(node: string, vmid: number): Promise<string>;
145
+ /** Restart (reboot) a QEMU VM */
146
+ restartVM(node: string, vmid: number): Promise<string>;
147
+ /** Get all resources across the cluster */
148
+ listResources(type?: string): Promise<ProxmoxResource[]>;
149
+ /**
150
+ * Auto-detect the first available node name.
151
+ * Useful when the user hasn't specified a node in their profile.
152
+ */
153
+ detectNodeName(): Promise<string>;
154
+ }
155
+ export declare class ProxmoxApiError extends Error {
156
+ readonly statusCode: number;
157
+ readonly responseBody: string;
158
+ constructor(message: string, statusCode: number, responseBody: string);
159
+ }
160
+ //# sourceMappingURL=proxmox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxmox.d.ts","sourceRoot":"","sources":["../../src/server/proxmox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Proxmox VE API client — HTTP client for Proxmox REST API
3
+ // ---------------------------------------------------------------------------
4
+ // Authenticates via PVEAPIToken header. Supports self-signed TLS certificates.
5
+ // Uses native fetch (Node 18+) — no axios needed.
6
+ // ---------------------------------------------------------------------------
7
+ import { Agent } from 'node:https';
8
+ import { logger } from '../utils/logger.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Proxmox API Client
11
+ // ---------------------------------------------------------------------------
12
+ export class ProxmoxClient {
13
+ baseUrl;
14
+ authHeader;
15
+ allowSelfSigned;
16
+ constructor(options) {
17
+ this.baseUrl = `https://${options.host}:${options.port}/api2/json`;
18
+ this.authHeader = `PVEAPIToken=${options.apiTokenId}=${options.apiTokenSecret}`;
19
+ this.allowSelfSigned = options.allowSelfSigned ?? true;
20
+ logger.debug('ProxmoxClient initialized', {
21
+ host: options.host,
22
+ port: options.port,
23
+ tokenId: options.apiTokenId,
24
+ });
25
+ }
26
+ // -----------------------------------------------------------------------
27
+ // Core HTTP methods
28
+ // -----------------------------------------------------------------------
29
+ buildFetchOptions(method, body) {
30
+ const headers = {
31
+ Authorization: this.authHeader,
32
+ Accept: 'application/json',
33
+ };
34
+ const init = {
35
+ method,
36
+ headers,
37
+ };
38
+ if (body) {
39
+ headers['Content-Type'] = 'application/json';
40
+ init.body = JSON.stringify(body);
41
+ }
42
+ // Handle self-signed certificates
43
+ if (this.allowSelfSigned) {
44
+ // Node 18+ supports dispatcher option for custom agents
45
+ // We use the undici-compatible approach via env or agent
46
+ init['dispatcher'] = new Agent({
47
+ rejectUnauthorized: false,
48
+ });
49
+ }
50
+ return init;
51
+ }
52
+ async request(method, path, body) {
53
+ const url = `${this.baseUrl}${path}`;
54
+ logger.debug(`Proxmox API ${method} ${path}`);
55
+ // For self-signed certs, we need to temporarily disable TLS verification
56
+ // Node's native fetch doesn't support custom agents directly,
57
+ // so we use the NODE_TLS_REJECT_UNAUTHORIZED approach scoped to this request
58
+ const originalTlsSetting = process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
59
+ try {
60
+ if (this.allowSelfSigned) {
61
+ process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
62
+ }
63
+ const response = await fetch(url, this.buildFetchOptions(method, body));
64
+ if (!response.ok) {
65
+ const errorBody = await response.text().catch(() => 'unknown');
66
+ throw new ProxmoxApiError(`Proxmox API error: ${response.status} ${response.statusText}`, response.status, errorBody);
67
+ }
68
+ const json = (await response.json());
69
+ return json.data;
70
+ }
71
+ catch (err) {
72
+ if (err instanceof ProxmoxApiError)
73
+ throw err;
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ logger.error(`Proxmox API request failed: ${method} ${path}`, { error: message });
76
+ if (message.includes('ECONNREFUSED')) {
77
+ throw new ProxmoxApiError(`Cannot connect to Proxmox at ${this.baseUrl} — connection refused`, 0, message);
78
+ }
79
+ if (message.includes('ETIMEDOUT') || message.includes('timeout')) {
80
+ throw new ProxmoxApiError(`Connection to Proxmox timed out — check host and port`, 0, message);
81
+ }
82
+ if (message.includes('ENOTFOUND')) {
83
+ throw new ProxmoxApiError(`Cannot resolve Proxmox hostname — check host configuration`, 0, message);
84
+ }
85
+ throw new ProxmoxApiError(`Proxmox API request failed: ${message}`, 0, message);
86
+ }
87
+ finally {
88
+ // Restore original TLS setting
89
+ if (originalTlsSetting === undefined) {
90
+ delete process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
91
+ }
92
+ else {
93
+ process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = originalTlsSetting;
94
+ }
95
+ }
96
+ }
97
+ async get(path) {
98
+ return await this.request('GET', path);
99
+ }
100
+ async post(path, body) {
101
+ return await this.request('POST', path, body);
102
+ }
103
+ async put(path, body) {
104
+ return await this.request('PUT', path, body);
105
+ }
106
+ async del(path) {
107
+ return await this.request('DELETE', path);
108
+ }
109
+ // -----------------------------------------------------------------------
110
+ // Connection test
111
+ // -----------------------------------------------------------------------
112
+ /** Test the connection by fetching the Proxmox version */
113
+ async testConnection() {
114
+ return await this.get('/version');
115
+ }
116
+ // -----------------------------------------------------------------------
117
+ // Nodes
118
+ // -----------------------------------------------------------------------
119
+ /** List all nodes in the cluster */
120
+ async listNodes() {
121
+ return await this.get('/nodes');
122
+ }
123
+ /** Get status of a specific node */
124
+ async getNodeStatus(node) {
125
+ return await this.get(`/nodes/${encodeURIComponent(node)}/status`);
126
+ }
127
+ // -----------------------------------------------------------------------
128
+ // Containers (LXC)
129
+ // -----------------------------------------------------------------------
130
+ /** List all LXC containers on a node */
131
+ async listContainers(node) {
132
+ return await this.get(`/nodes/${encodeURIComponent(node)}/lxc`);
133
+ }
134
+ /** Get current status of an LXC container */
135
+ async getContainerStatus(node, vmid) {
136
+ return await this.get(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/current`);
137
+ }
138
+ /** Get configuration of an LXC container */
139
+ async getContainerConfig(node, vmid) {
140
+ return await this.get(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/config`);
141
+ }
142
+ /** Start an LXC container */
143
+ async startContainer(node, vmid) {
144
+ return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/start`);
145
+ }
146
+ /** Stop an LXC container */
147
+ async stopContainer(node, vmid) {
148
+ return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/stop`);
149
+ }
150
+ /** Restart (reboot) an LXC container */
151
+ async restartContainer(node, vmid) {
152
+ return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/reboot`);
153
+ }
154
+ // -----------------------------------------------------------------------
155
+ // Virtual Machines (QEMU)
156
+ // -----------------------------------------------------------------------
157
+ /** List all QEMU VMs on a node */
158
+ async listVMs(node) {
159
+ return await this.get(`/nodes/${encodeURIComponent(node)}/qemu`);
160
+ }
161
+ /** Get current status of a QEMU VM */
162
+ async getVMStatus(node, vmid) {
163
+ return await this.get(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/current`);
164
+ }
165
+ /** Get configuration of a QEMU VM */
166
+ async getVMConfig(node, vmid) {
167
+ return await this.get(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/config`);
168
+ }
169
+ /** Start a QEMU VM */
170
+ async startVM(node, vmid) {
171
+ return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/start`);
172
+ }
173
+ /** Stop a QEMU VM */
174
+ async stopVM(node, vmid) {
175
+ return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/stop`);
176
+ }
177
+ /** Restart (reboot) a QEMU VM */
178
+ async restartVM(node, vmid) {
179
+ return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/reboot`);
180
+ }
181
+ // -----------------------------------------------------------------------
182
+ // Cluster resources
183
+ // -----------------------------------------------------------------------
184
+ /** Get all resources across the cluster */
185
+ async listResources(type) {
186
+ const query = type ? `?type=${encodeURIComponent(type)}` : '';
187
+ return await this.get(`/cluster/resources${query}`);
188
+ }
189
+ // -----------------------------------------------------------------------
190
+ // Utility: auto-detect node name
191
+ // -----------------------------------------------------------------------
192
+ /**
193
+ * Auto-detect the first available node name.
194
+ * Useful when the user hasn't specified a node in their profile.
195
+ */
196
+ async detectNodeName() {
197
+ const nodes = await this.listNodes();
198
+ if (nodes.length === 0) {
199
+ throw new ProxmoxApiError('No nodes found in the Proxmox cluster', 0, '');
200
+ }
201
+ // Return the first online node, or first node if none are explicitly online
202
+ const onlineNode = nodes.find((n) => n.status === 'online');
203
+ return (onlineNode ?? nodes[0]).node;
204
+ }
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // Custom error class
208
+ // ---------------------------------------------------------------------------
209
+ export class ProxmoxApiError extends Error {
210
+ statusCode;
211
+ responseBody;
212
+ constructor(message, statusCode, responseBody) {
213
+ super(message);
214
+ this.name = 'ProxmoxApiError';
215
+ this.statusCode = statusCode;
216
+ this.responseBody = responseBody;
217
+ }
218
+ }
219
+ //# sourceMappingURL=proxmox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxmox.js","sourceRoot":"","sources":["../../src/server/proxmox.ts"],"names":[],"mappings":"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"}