@calltelemetry/ct-lab-mcp 0.1.5 → 0.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 (139) hide show
  1. package/dist/bin/ct-lab-mcp.d.ts.map +1 -1
  2. package/dist/bin/ct-lab-mcp.js +21 -7
  3. package/dist/bin/ct-lab-mcp.js.map +1 -1
  4. package/dist/src/appliance/commands.d.ts.map +1 -1
  5. package/dist/src/appliance/commands.js +24 -0
  6. package/dist/src/appliance/commands.js.map +1 -1
  7. package/dist/src/appliance/executor.d.ts.map +1 -1
  8. package/dist/src/appliance/executor.js +7 -1
  9. package/dist/src/appliance/executor.js.map +1 -1
  10. package/dist/src/appliance/mock.d.ts +6 -0
  11. package/dist/src/appliance/mock.d.ts.map +1 -1
  12. package/dist/src/appliance/mock.js +27 -6
  13. package/dist/src/appliance/mock.js.map +1 -1
  14. package/dist/src/appliance/types.d.ts +20 -1
  15. package/dist/src/appliance/types.d.ts.map +1 -1
  16. package/dist/src/appliance/types.js.map +1 -1
  17. package/dist/src/credentials/errors.d.ts +16 -0
  18. package/dist/src/credentials/errors.d.ts.map +1 -0
  19. package/dist/src/credentials/errors.js +21 -0
  20. package/dist/src/credentials/errors.js.map +1 -0
  21. package/dist/src/credentials/resolver.d.ts +16 -0
  22. package/dist/src/credentials/resolver.d.ts.map +1 -1
  23. package/dist/src/credentials/resolver.js +104 -10
  24. package/dist/src/credentials/resolver.js.map +1 -1
  25. package/dist/src/credentials/types.d.ts +8 -0
  26. package/dist/src/credentials/types.d.ts.map +1 -1
  27. package/dist/src/diagnostics/collector.d.ts +37 -0
  28. package/dist/src/diagnostics/collector.d.ts.map +1 -0
  29. package/dist/src/diagnostics/collector.js +452 -0
  30. package/dist/src/diagnostics/collector.js.map +1 -0
  31. package/dist/src/diagnostics/types.d.ts +103 -0
  32. package/dist/src/diagnostics/types.d.ts.map +1 -0
  33. package/dist/src/diagnostics/types.js +8 -0
  34. package/dist/src/diagnostics/types.js.map +1 -0
  35. package/dist/src/hypervisors/esxi/client.d.ts +1 -0
  36. package/dist/src/hypervisors/esxi/client.d.ts.map +1 -1
  37. package/dist/src/hypervisors/esxi/client.js +15 -3
  38. package/dist/src/hypervisors/esxi/client.js.map +1 -1
  39. package/dist/src/hypervisors/esxi/mock.d.ts +1 -0
  40. package/dist/src/hypervisors/esxi/mock.d.ts.map +1 -1
  41. package/dist/src/hypervisors/esxi/mock.js +4 -0
  42. package/dist/src/hypervisors/esxi/mock.js.map +1 -1
  43. package/dist/src/hypervisors/manager.d.ts.map +1 -1
  44. package/dist/src/hypervisors/manager.js +37 -3
  45. package/dist/src/hypervisors/manager.js.map +1 -1
  46. package/dist/src/hypervisors/proxmox/client.d.ts +13 -1
  47. package/dist/src/hypervisors/proxmox/client.d.ts.map +1 -1
  48. package/dist/src/hypervisors/proxmox/client.js +485 -4
  49. package/dist/src/hypervisors/proxmox/client.js.map +1 -1
  50. package/dist/src/hypervisors/proxmox/mock.d.ts +1 -0
  51. package/dist/src/hypervisors/proxmox/mock.d.ts.map +1 -1
  52. package/dist/src/hypervisors/proxmox/mock.js +4 -0
  53. package/dist/src/hypervisors/proxmox/mock.js.map +1 -1
  54. package/dist/src/hypervisors/types.d.ts +119 -2
  55. package/dist/src/hypervisors/types.d.ts.map +1 -1
  56. package/dist/src/proxmox/mock.d.ts +1 -1
  57. package/dist/src/proxmox/mock.d.ts.map +1 -1
  58. package/dist/src/proxmox/mock.js +103 -1
  59. package/dist/src/proxmox/mock.js.map +1 -1
  60. package/dist/src/server.d.ts.map +1 -1
  61. package/dist/src/server.js +2 -0
  62. package/dist/src/server.js.map +1 -1
  63. package/dist/src/slot/manager.d.ts +26 -1
  64. package/dist/src/slot/manager.d.ts.map +1 -1
  65. package/dist/src/slot/manager.js +278 -1
  66. package/dist/src/slot/manager.js.map +1 -1
  67. package/dist/src/slot/types.d.ts +49 -0
  68. package/dist/src/slot/types.d.ts.map +1 -1
  69. package/dist/src/slot/types.js +18 -0
  70. package/dist/src/slot/types.js.map +1 -1
  71. package/dist/src/tools/credential-status.d.ts +29 -0
  72. package/dist/src/tools/credential-status.d.ts.map +1 -0
  73. package/dist/src/tools/credential-status.js +81 -0
  74. package/dist/src/tools/credential-status.js.map +1 -0
  75. package/dist/src/tools/cube-provision.d.ts +288 -0
  76. package/dist/src/tools/cube-provision.d.ts.map +1 -0
  77. package/dist/src/tools/cube-provision.js +892 -0
  78. package/dist/src/tools/cube-provision.js.map +1 -0
  79. package/dist/src/tools/cube-tools.d.ts +137 -0
  80. package/dist/src/tools/cube-tools.d.ts.map +1 -0
  81. package/dist/src/tools/cube-tools.js +292 -0
  82. package/dist/src/tools/cube-tools.js.map +1 -0
  83. package/dist/src/tools/cucm-emulator-tool.d.ts +85 -0
  84. package/dist/src/tools/cucm-emulator-tool.d.ts.map +1 -0
  85. package/dist/src/tools/cucm-emulator-tool.js +191 -0
  86. package/dist/src/tools/cucm-emulator-tool.js.map +1 -0
  87. package/dist/src/tools/cucm-trunk.d.ts +165 -0
  88. package/dist/src/tools/cucm-trunk.d.ts.map +1 -0
  89. package/dist/src/tools/cucm-trunk.js +354 -0
  90. package/dist/src/tools/cucm-trunk.js.map +1 -0
  91. package/dist/src/tools/diagnostics.d.ts +58 -0
  92. package/dist/src/tools/diagnostics.d.ts.map +1 -0
  93. package/dist/src/tools/diagnostics.js +212 -0
  94. package/dist/src/tools/diagnostics.js.map +1 -0
  95. package/dist/src/tools/guest-agent.d.ts +34 -0
  96. package/dist/src/tools/guest-agent.d.ts.map +1 -0
  97. package/dist/src/tools/guest-agent.js +133 -0
  98. package/dist/src/tools/guest-agent.js.map +1 -0
  99. package/dist/src/tools/index.d.ts +10 -0
  100. package/dist/src/tools/index.d.ts.map +1 -1
  101. package/dist/src/tools/index.js +97 -1
  102. package/dist/src/tools/index.js.map +1 -1
  103. package/dist/src/tools/list-hosts.d.ts +9 -0
  104. package/dist/src/tools/list-hosts.d.ts.map +1 -1
  105. package/dist/src/tools/list-hosts.js.map +1 -1
  106. package/dist/src/tools/network-tools.d.ts +65 -0
  107. package/dist/src/tools/network-tools.d.ts.map +1 -0
  108. package/dist/src/tools/network-tools.js +200 -0
  109. package/dist/src/tools/network-tools.js.map +1 -0
  110. package/dist/src/tools/provision-tools.d.ts.map +1 -1
  111. package/dist/src/tools/provision-tools.js +19 -0
  112. package/dist/src/tools/provision-tools.js.map +1 -1
  113. package/dist/src/tools/server-management.d.ts +51 -0
  114. package/dist/src/tools/server-management.d.ts.map +1 -0
  115. package/dist/src/tools/server-management.js +175 -0
  116. package/dist/src/tools/server-management.js.map +1 -0
  117. package/dist/src/tools/storage-tools.d.ts +177 -0
  118. package/dist/src/tools/storage-tools.d.ts.map +1 -1
  119. package/dist/src/tools/storage-tools.js +420 -0
  120. package/dist/src/tools/storage-tools.js.map +1 -1
  121. package/dist/src/tools/update-cli.d.ts +62 -0
  122. package/dist/src/tools/update-cli.d.ts.map +1 -0
  123. package/dist/src/tools/update-cli.js +142 -0
  124. package/dist/src/tools/update-cli.js.map +1 -0
  125. package/dist/src/tools/vm-action.d.ts +6 -6
  126. package/dist/src/tools/vm-action.d.ts.map +1 -1
  127. package/dist/src/tools/vm-action.js +3 -1
  128. package/dist/src/tools/vm-action.js.map +1 -1
  129. package/dist/src/types/mcp.d.ts +5 -1
  130. package/dist/src/types/mcp.d.ts.map +1 -1
  131. package/dist/src/types/mcp.js +14 -0
  132. package/dist/src/types/mcp.js.map +1 -1
  133. package/dist/src/types/proxmox.d.ts +1 -0
  134. package/dist/src/types/proxmox.d.ts.map +1 -1
  135. package/dist/src/utils/formatters.d.ts +7 -0
  136. package/dist/src/utils/formatters.d.ts.map +1 -1
  137. package/dist/src/utils/formatters.js +48 -5
  138. package/dist/src/utils/formatters.js.map +1 -1
  139. package/package.json +1 -1
@@ -70,4 +70,181 @@ export declare const CleanStorageInputSchema: z.ZodObject<{
70
70
  snapshotName?: string | undefined;
71
71
  }>;
72
72
  export declare function handleCleanStorage(args: unknown, context: ToolContext): Promise<CallToolResult>;
73
+ export declare const GetVmStorageInputShape: {
74
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
75
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
76
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
77
+ };
78
+ export declare const GetVmStorageInputSchema: z.ZodEffects<z.ZodObject<{
79
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
80
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
81
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
82
+ }, "strip", z.ZodTypeAny, {
83
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
84
+ target?: string | number | undefined;
85
+ vmIdOrName?: string | number | undefined;
86
+ }, {
87
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
88
+ target?: string | number | undefined;
89
+ vmIdOrName?: string | number | undefined;
90
+ }>, {
91
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
92
+ target?: string | number | undefined;
93
+ vmIdOrName?: string | number | undefined;
94
+ }, {
95
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
96
+ target?: string | number | undefined;
97
+ vmIdOrName?: string | number | undefined;
98
+ }>;
99
+ export declare function handleGetVmStorage(args: unknown, context: ToolContext): Promise<CallToolResult>;
100
+ export declare const MountIsoInputShape: {
101
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
102
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
103
+ iso: z.ZodString;
104
+ drive: z.ZodDefault<z.ZodOptional<z.ZodString>>;
105
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
106
+ };
107
+ export declare const MountIsoInputSchema: z.ZodEffects<z.ZodObject<{
108
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
109
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
110
+ iso: z.ZodString;
111
+ drive: z.ZodDefault<z.ZodOptional<z.ZodString>>;
112
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
115
+ iso: string;
116
+ drive: string;
117
+ target?: string | number | undefined;
118
+ vmIdOrName?: string | number | undefined;
119
+ }, {
120
+ iso: string;
121
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
122
+ target?: string | number | undefined;
123
+ vmIdOrName?: string | number | undefined;
124
+ drive?: string | undefined;
125
+ }>, {
126
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
127
+ iso: string;
128
+ drive: string;
129
+ target?: string | number | undefined;
130
+ vmIdOrName?: string | number | undefined;
131
+ }, {
132
+ iso: string;
133
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
134
+ target?: string | number | undefined;
135
+ vmIdOrName?: string | number | undefined;
136
+ drive?: string | undefined;
137
+ }>;
138
+ export declare function handleMountIso(args: unknown, context: ToolContext): Promise<CallToolResult>;
139
+ export declare const UnmountIsoInputShape: {
140
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
141
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
142
+ drive: z.ZodDefault<z.ZodOptional<z.ZodString>>;
143
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
144
+ };
145
+ export declare const UnmountIsoInputSchema: z.ZodEffects<z.ZodObject<{
146
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
147
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
148
+ drive: z.ZodDefault<z.ZodOptional<z.ZodString>>;
149
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
150
+ }, "strip", z.ZodTypeAny, {
151
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
152
+ drive: string;
153
+ target?: string | number | undefined;
154
+ vmIdOrName?: string | number | undefined;
155
+ }, {
156
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
157
+ target?: string | number | undefined;
158
+ vmIdOrName?: string | number | undefined;
159
+ drive?: string | undefined;
160
+ }>, {
161
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
162
+ drive: string;
163
+ target?: string | number | undefined;
164
+ vmIdOrName?: string | number | undefined;
165
+ }, {
166
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
167
+ target?: string | number | undefined;
168
+ vmIdOrName?: string | number | undefined;
169
+ drive?: string | undefined;
170
+ }>;
171
+ export declare function handleUnmountIso(args: unknown, context: ToolContext): Promise<CallToolResult>;
172
+ export declare const CreateSnapshotInputShape: {
173
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
174
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
175
+ snapshotName: z.ZodString;
176
+ description: z.ZodOptional<z.ZodString>;
177
+ includeRam: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
178
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
179
+ };
180
+ export declare const CreateSnapshotInputSchema: z.ZodEffects<z.ZodObject<{
181
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
182
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
183
+ snapshotName: z.ZodString;
184
+ description: z.ZodOptional<z.ZodString>;
185
+ includeRam: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
186
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
187
+ }, "strip", z.ZodTypeAny, {
188
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
189
+ snapshotName: string;
190
+ includeRam: boolean;
191
+ description?: string | undefined;
192
+ target?: string | number | undefined;
193
+ vmIdOrName?: string | number | undefined;
194
+ }, {
195
+ snapshotName: string;
196
+ description?: string | undefined;
197
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
198
+ target?: string | number | undefined;
199
+ vmIdOrName?: string | number | undefined;
200
+ includeRam?: boolean | undefined;
201
+ }>, {
202
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
203
+ snapshotName: string;
204
+ includeRam: boolean;
205
+ description?: string | undefined;
206
+ target?: string | number | undefined;
207
+ vmIdOrName?: string | number | undefined;
208
+ }, {
209
+ snapshotName: string;
210
+ description?: string | undefined;
211
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
212
+ target?: string | number | undefined;
213
+ vmIdOrName?: string | number | undefined;
214
+ includeRam?: boolean | undefined;
215
+ }>;
216
+ export declare function handleCreateSnapshot(args: unknown, context: ToolContext): Promise<CallToolResult>;
217
+ export declare const RollbackSnapshotInputShape: {
218
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
219
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
220
+ snapshotName: z.ZodString;
221
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
222
+ };
223
+ export declare const RollbackSnapshotInputSchema: z.ZodEffects<z.ZodObject<{
224
+ target: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
225
+ vmIdOrName: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
226
+ snapshotName: z.ZodString;
227
+ host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"]>>>;
228
+ }, "strip", z.ZodTypeAny, {
229
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
230
+ snapshotName: string;
231
+ target?: string | number | undefined;
232
+ vmIdOrName?: string | number | undefined;
233
+ }, {
234
+ snapshotName: string;
235
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
236
+ target?: string | number | undefined;
237
+ vmIdOrName?: string | number | undefined;
238
+ }>, {
239
+ host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto";
240
+ snapshotName: string;
241
+ target?: string | number | undefined;
242
+ vmIdOrName?: string | number | undefined;
243
+ }, {
244
+ snapshotName: string;
245
+ host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "esxi-intel-192-168-123-176" | "auto" | undefined;
246
+ target?: string | number | undefined;
247
+ vmIdOrName?: string | number | undefined;
248
+ }>;
249
+ export declare function handleRollbackSnapshot(args: unknown, context: ToolContext): Promise<CallToolResult>;
73
250
  //# sourceMappingURL=storage-tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/storage-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AAS1F,eAAO,MAAM,qBAAqB;;;;CAejC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAAkC,CAAC;AAEtE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAuDzB;AAuCD,eAAO,MAAM,uBAAuB;;;CAUnC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;EAAoC,CAAC;AAE1E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAqDzB;AAMD,eAAO,MAAM,sBAAsB;;;;;;CAmBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAAmC,CAAC;AAExE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAyEzB"}
1
+ {"version":3,"file":"storage-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/storage-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AAS1F,eAAO,MAAM,qBAAqB;;;;CAejC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAAkC,CAAC;AAEtE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAuDzB;AAuCD,eAAO,MAAM,uBAAuB;;;CAUnC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;EAAoC,CAAC;AAE1E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAqDzB;AAMD,eAAO,MAAM,sBAAsB;;;;;;CAmBlC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAAmC,CAAC;AAExE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAyEzB;AAMD,eAAO,MAAM,sBAAsB;;;;CAclC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;EAKjC,CAAC;AAEJ,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CA2FzB;AAMD,eAAO,MAAM,kBAAkB;;;;;;CAsB9B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7B,CAAC;AAEJ,wBAAsB,cAAc,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAwDzB;AAMD,eAAO,MAAM,oBAAoB;;;;;CAmBhC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;EAK/B,CAAC;AAEJ,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAwDzB;AAMD,eAAO,MAAM,wBAAwB;;;;;;;CA0BpC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKnC,CAAC;AAEJ,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAwDzB;AAMD,eAAO,MAAM,0BAA0B;;;;;CAiBtC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;EAKrC,CAAC;AAEJ,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAwDzB"}
@@ -262,4 +262,424 @@ export async function handleCleanStorage(args, context) {
262
262
  return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to clean storage on '${host}': ${msg}`);
263
263
  }
264
264
  }
265
+ // ============================================================================
266
+ // 4. get_vm_storage
267
+ // ============================================================================
268
+ export const GetVmStorageInputShape = {
269
+ target: z
270
+ .union([z.string(), z.number()])
271
+ .optional()
272
+ .describe("VM ID or name to query storage for (e.g. '105' or 'ct-appliance-slot2-thin')."),
273
+ vmIdOrName: z
274
+ .union([z.string(), z.number()])
275
+ .optional()
276
+ .describe("Alias for target."),
277
+ host: z
278
+ .enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"])
279
+ .optional()
280
+ .default("auto")
281
+ .describe("Hypervisor host or 'auto' to auto-discover.")
282
+ };
283
+ export const GetVmStorageInputSchema = z
284
+ .object(GetVmStorageInputShape)
285
+ .refine((data) => Boolean(data.target || data.vmIdOrName), { message: "VM target ('target' or 'vmIdOrName') is required." });
286
+ export async function handleGetVmStorage(args, context) {
287
+ const parsed = GetVmStorageInputSchema.safeParse(args || {});
288
+ if (!parsed.success) {
289
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for get_vm_storage.");
290
+ }
291
+ const target = parsed.data.target || parsed.data.vmIdOrName;
292
+ const targetHost = parsed.data.host;
293
+ const drivers = context.hypervisorManager?.getAllDrivers() || [];
294
+ let foundDriver = targetHost && targetHost !== "auto"
295
+ ? drivers.find(d => d.hostName === targetHost || (targetHost === "proxmox-mini" && d.hostName === "proxmox-minis-lab"))
296
+ : null;
297
+ let vmRecord = null;
298
+ if (foundDriver) {
299
+ vmRecord = await foundDriver.getVm(target);
300
+ }
301
+ else {
302
+ for (const d of drivers) {
303
+ const vm = await d.getVm(target);
304
+ if (vm) {
305
+ foundDriver = d;
306
+ vmRecord = vm;
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ if (!foundDriver || !vmRecord) {
312
+ return createToolErrorResult(ProxmoxErrorCode.VM_NOT_FOUND, `VM '${target}' was not found on any hypervisor host.`);
313
+ }
314
+ if (!foundDriver.getVmStorage) {
315
+ return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${foundDriver.hostName}' does not support getVmStorage.`);
316
+ }
317
+ try {
318
+ const report = await foundDriver.getVmStorage(vmRecord.id);
319
+ // Format Markdown tables
320
+ const diskRows = report.disks.map((d) => {
321
+ const sizeStr = d.sizeGb ? `${d.sizeGb.toFixed(1)} GB` : "Unknown";
322
+ const flags = [d.discard ? "discard" : null, d.ssd ? "ssd" : null].filter(Boolean).join(", ");
323
+ return `| **\`${d.drive}\`** | \`${d.storage}\` | **\`${d.volid}\`** | ${sizeStr} | \`${d.format}\` | ${flags || "standard"} |`;
324
+ }).join("\n");
325
+ const cdromRows = report.cdroms.map((c) => {
326
+ const mediaStr = c.volid === "none" || !c.volid ? "*(Empty / Ejected)*" : `**\`${c.volid}\`**`;
327
+ return `| **\`${c.drive}\`** | ${mediaStr} | \`${c.storage}\` | \`cdrom\` |`;
328
+ }).join("\n");
329
+ let fsSection = "";
330
+ if (report.guestFilesystems && report.guestFilesystems.length > 0) {
331
+ const fsRows = report.guestFilesystems.map((fs) => {
332
+ const totalGb = (fs.totalBytes / (1024 * 1024 * 1024)).toFixed(2);
333
+ const usedGb = (fs.usedBytes / (1024 * 1024 * 1024)).toFixed(2);
334
+ const availGb = (fs.availableBytes / (1024 * 1024 * 1024)).toFixed(2);
335
+ const icon = fs.usedPercent > 85 ? "🔴" : fs.usedPercent > 70 ? "🟡" : "🟢";
336
+ return `| **\`${fs.mountPoint}\`** | \`${fs.fsType}\` | ${totalGb} GB | ${usedGb} GB (${fs.usedPercent}%) | **${availGb} GB** | ${icon} | \`${fs.diskDevice || "N/A"}\` |`;
337
+ }).join("\n");
338
+ fsSection = `\n\n#### 💽 Live Guest OS Filesystems (QEMU Agent)\n\n| Mount Point | Type | Total | Used (%) | Free | Status | Device |\n|---|:---:|:---:|:---:|:---:|:---:|:---:|\n${fsRows}`;
339
+ }
340
+ else {
341
+ fsSection = `\n\n*Guest Filesystem Info: ${report.status === "running" ? "QEMU Agent not responding / initializing" : "VM is stopped"}*`;
342
+ }
343
+ const markdown = `### 💾 VM Storage & Filesystem Analysis: **${report.vmName}** (\`${report.vmId}\`)
344
+
345
+ *Host:* \`${report.hostName}\` | *Status:* **${report.status}** | *Guest Agent:* **${report.guestAgentActive ? "🟢 Active" : "⚪ Offline"}**
346
+
347
+ #### 🗄️ Hypervisor Virtual Disks
348
+ | Drive | Storage Pool | Volume ID | Size | Format | Flags |
349
+ |---|---|---|:---:|:---:|:---:|
350
+ ${diskRows || "| - | No virtual disks attached | - | - | - | - |"}
351
+
352
+ #### 💿 Optical Drives & Mounted Media (CD-ROM)
353
+ | Drive | Mounted Media / ISO | Storage Pool | Type |
354
+ |---|---|---|:---:|
355
+ ${cdromRows || "| - | No CD-ROM drives configured | - | - |"}${fsSection}`;
356
+ return {
357
+ content: [{ type: "text", text: markdown }],
358
+ structuredContent: {
359
+ success: true,
360
+ report
361
+ }
362
+ };
363
+ }
364
+ catch (err) {
365
+ const msg = err instanceof Error ? err.message : String(err);
366
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `Failed to query VM storage for '${target}': ${msg}`);
367
+ }
368
+ }
369
+ // ============================================================================
370
+ // 5. mount_iso
371
+ // ============================================================================
372
+ export const MountIsoInputShape = {
373
+ target: z
374
+ .union([z.string(), z.number()])
375
+ .optional()
376
+ .describe("Target VM ID or name to mount ISO onto (e.g. '105' or 'ct-appliance-slot2-thin')."),
377
+ vmIdOrName: z
378
+ .union([z.string(), z.number()])
379
+ .optional()
380
+ .describe("Alias for target."),
381
+ iso: z
382
+ .string()
383
+ .describe("ISO Volume ID to mount (e.g. 'synology-cisco-isos:iso/c8000v-universalk9.17.18.02.iso' or 'local:iso/cube-pmx-internal-bootstrap.iso')."),
384
+ drive: z
385
+ .string()
386
+ .optional()
387
+ .default("ide2")
388
+ .describe("CD-ROM drive identifier (default: 'ide2')."),
389
+ host: z
390
+ .enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"])
391
+ .optional()
392
+ .default("auto")
393
+ .describe("Hypervisor host or 'auto'.")
394
+ };
395
+ export const MountIsoInputSchema = z
396
+ .object(MountIsoInputShape)
397
+ .refine((data) => Boolean(data.target || data.vmIdOrName), { message: "VM target ('target' or 'vmIdOrName') is required." });
398
+ export async function handleMountIso(args, context) {
399
+ const parsed = MountIsoInputSchema.safeParse(args || {});
400
+ if (!parsed.success) {
401
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for mount_iso.");
402
+ }
403
+ const target = parsed.data.target || parsed.data.vmIdOrName;
404
+ const { iso, drive, host: targetHost } = parsed.data;
405
+ const drivers = context.hypervisorManager?.getAllDrivers() || [];
406
+ let foundDriver = targetHost && targetHost !== "auto"
407
+ ? drivers.find(d => d.hostName === targetHost || (targetHost === "proxmox-mini" && d.hostName === "proxmox-minis-lab"))
408
+ : null;
409
+ let vmRecord = null;
410
+ if (foundDriver) {
411
+ vmRecord = await foundDriver.getVm(target);
412
+ }
413
+ else {
414
+ for (const d of drivers) {
415
+ const vm = await d.getVm(target);
416
+ if (vm) {
417
+ foundDriver = d;
418
+ vmRecord = vm;
419
+ break;
420
+ }
421
+ }
422
+ }
423
+ if (!foundDriver || !vmRecord) {
424
+ return createToolErrorResult(ProxmoxErrorCode.VM_NOT_FOUND, `VM '${target}' not found.`);
425
+ }
426
+ if (!foundDriver.mountIso) {
427
+ return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${foundDriver.hostName}' does not support mountIso.`);
428
+ }
429
+ try {
430
+ await foundDriver.mountIso(vmRecord.id, iso, drive);
431
+ telemetry.emit({
432
+ event: "storage.mount_iso",
433
+ actor: "ct-lab-mcp",
434
+ status: "success",
435
+ hostId: foundDriver.hostName,
436
+ vmId: vmRecord.id,
437
+ metadata: { iso, drive }
438
+ });
439
+ return {
440
+ content: [{ type: "text", text: `### 💿 ISO Mounted Successfully\n\nISO **\`${iso}\`** was mounted to drive **\`${drive}\`** on VM **${vmRecord.name}** (\`${vmRecord.id}\`) on host \`${foundDriver.hostName}\`.` }],
441
+ structuredContent: { success: true, host: foundDriver.hostName, vmId: vmRecord.id, vmName: vmRecord.name, iso, drive }
442
+ };
443
+ }
444
+ catch (err) {
445
+ const msg = err instanceof Error ? err.message : String(err);
446
+ return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to mount ISO on VM '${target}': ${msg}`);
447
+ }
448
+ }
449
+ // ============================================================================
450
+ // 6. unmount_iso
451
+ // ============================================================================
452
+ export const UnmountIsoInputShape = {
453
+ target: z
454
+ .union([z.string(), z.number()])
455
+ .optional()
456
+ .describe("Target VM ID or name to unmount ISO from (e.g. '105')."),
457
+ vmIdOrName: z
458
+ .union([z.string(), z.number()])
459
+ .optional()
460
+ .describe("Alias for target."),
461
+ drive: z
462
+ .string()
463
+ .optional()
464
+ .default("ide2")
465
+ .describe("CD-ROM drive identifier (default: 'ide2')."),
466
+ host: z
467
+ .enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"])
468
+ .optional()
469
+ .default("auto")
470
+ .describe("Hypervisor host or 'auto'.")
471
+ };
472
+ export const UnmountIsoInputSchema = z
473
+ .object(UnmountIsoInputShape)
474
+ .refine((data) => Boolean(data.target || data.vmIdOrName), { message: "VM target ('target' or 'vmIdOrName') is required." });
475
+ export async function handleUnmountIso(args, context) {
476
+ const parsed = UnmountIsoInputSchema.safeParse(args || {});
477
+ if (!parsed.success) {
478
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for unmount_iso.");
479
+ }
480
+ const target = parsed.data.target || parsed.data.vmIdOrName;
481
+ const { drive, host: targetHost } = parsed.data;
482
+ const drivers = context.hypervisorManager?.getAllDrivers() || [];
483
+ let foundDriver = targetHost && targetHost !== "auto"
484
+ ? drivers.find(d => d.hostName === targetHost || (targetHost === "proxmox-mini" && d.hostName === "proxmox-minis-lab"))
485
+ : null;
486
+ let vmRecord = null;
487
+ if (foundDriver) {
488
+ vmRecord = await foundDriver.getVm(target);
489
+ }
490
+ else {
491
+ for (const d of drivers) {
492
+ const vm = await d.getVm(target);
493
+ if (vm) {
494
+ foundDriver = d;
495
+ vmRecord = vm;
496
+ break;
497
+ }
498
+ }
499
+ }
500
+ if (!foundDriver || !vmRecord) {
501
+ return createToolErrorResult(ProxmoxErrorCode.VM_NOT_FOUND, `VM '${target}' not found.`);
502
+ }
503
+ if (!foundDriver.unmountIso) {
504
+ return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${foundDriver.hostName}' does not support unmountIso.`);
505
+ }
506
+ try {
507
+ await foundDriver.unmountIso(vmRecord.id, drive);
508
+ telemetry.emit({
509
+ event: "storage.unmount_iso",
510
+ actor: "ct-lab-mcp",
511
+ status: "success",
512
+ hostId: foundDriver.hostName,
513
+ vmId: vmRecord.id,
514
+ metadata: { drive }
515
+ });
516
+ return {
517
+ content: [{ type: "text", text: `### ⏏️ CD-ROM Drive Ejected\n\nDrive **\`${drive}\`** on VM **${vmRecord.name}** (\`${vmRecord.id}\`) on host \`${foundDriver.hostName}\` was unmounted / ejected.` }],
518
+ structuredContent: { success: true, host: foundDriver.hostName, vmId: vmRecord.id, vmName: vmRecord.name, drive }
519
+ };
520
+ }
521
+ catch (err) {
522
+ const msg = err instanceof Error ? err.message : String(err);
523
+ return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to unmount ISO on VM '${target}': ${msg}`);
524
+ }
525
+ }
526
+ // ============================================================================
527
+ // 7. create_snapshot
528
+ // ============================================================================
529
+ export const CreateSnapshotInputShape = {
530
+ target: z
531
+ .union([z.string(), z.number()])
532
+ .optional()
533
+ .describe("Target VM ID or name to snapshot (e.g. '105' or 'ct-appliance-slot2-thin')."),
534
+ vmIdOrName: z
535
+ .union([z.string(), z.number()])
536
+ .optional()
537
+ .describe("Alias for target."),
538
+ snapshotName: z
539
+ .string()
540
+ .describe("Name for the new snapshot (e.g. 'pre-upgrade', 'clean-base')."),
541
+ description: z
542
+ .string()
543
+ .optional()
544
+ .describe("Optional human-readable description for the snapshot."),
545
+ includeRam: z
546
+ .boolean()
547
+ .optional()
548
+ .default(false)
549
+ .describe("Whether to include RAM / live memory state in the snapshot (default: false)."),
550
+ host: z
551
+ .enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"])
552
+ .optional()
553
+ .default("auto")
554
+ .describe("Hypervisor host or 'auto'.")
555
+ };
556
+ export const CreateSnapshotInputSchema = z
557
+ .object(CreateSnapshotInputShape)
558
+ .refine((data) => Boolean(data.target || data.vmIdOrName), { message: "VM target ('target' or 'vmIdOrName') is required." });
559
+ export async function handleCreateSnapshot(args, context) {
560
+ const parsed = CreateSnapshotInputSchema.safeParse(args || {});
561
+ if (!parsed.success) {
562
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for create_snapshot.");
563
+ }
564
+ const target = parsed.data.target || parsed.data.vmIdOrName;
565
+ const { snapshotName, description, includeRam, host: targetHost } = parsed.data;
566
+ const drivers = context.hypervisorManager?.getAllDrivers() || [];
567
+ let foundDriver = targetHost && targetHost !== "auto"
568
+ ? drivers.find(d => d.hostName === targetHost || (targetHost === "proxmox-mini" && d.hostName === "proxmox-minis-lab"))
569
+ : null;
570
+ let vmRecord = null;
571
+ if (foundDriver) {
572
+ vmRecord = await foundDriver.getVm(target);
573
+ }
574
+ else {
575
+ for (const d of drivers) {
576
+ const vm = await d.getVm(target);
577
+ if (vm) {
578
+ foundDriver = d;
579
+ vmRecord = vm;
580
+ break;
581
+ }
582
+ }
583
+ }
584
+ if (!foundDriver || !vmRecord) {
585
+ return createToolErrorResult(ProxmoxErrorCode.VM_NOT_FOUND, `VM '${target}' not found.`);
586
+ }
587
+ if (!foundDriver.createSnapshot) {
588
+ return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${foundDriver.hostName}' does not support createSnapshot.`);
589
+ }
590
+ try {
591
+ await foundDriver.createSnapshot(vmRecord.id, snapshotName, description, includeRam);
592
+ telemetry.emit({
593
+ event: "storage.create_snapshot",
594
+ actor: "ct-lab-mcp",
595
+ status: "success",
596
+ hostId: foundDriver.hostName,
597
+ vmId: vmRecord.id,
598
+ metadata: { snapshotName, includeRam }
599
+ });
600
+ return {
601
+ content: [{ type: "text", text: `### 📸 Snapshot Created Successfully\n\nSnapshot **\`${snapshotName}\`** was created for VM **${vmRecord.name}** (\`${vmRecord.id}\`) on host \`${foundDriver.hostName}\`.\n*RAM State:* ${includeRam ? "Included" : "Disk Only"}\n*Description:* ${description || "None"}` }],
602
+ structuredContent: { success: true, host: foundDriver.hostName, vmId: vmRecord.id, vmName: vmRecord.name, snapshotName, includeRam, description }
603
+ };
604
+ }
605
+ catch (err) {
606
+ const msg = err instanceof Error ? err.message : String(err);
607
+ return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to create snapshot '${snapshotName}' on VM '${target}': ${msg}`);
608
+ }
609
+ }
610
+ // ============================================================================
611
+ // 8. rollback_snapshot
612
+ // ============================================================================
613
+ export const RollbackSnapshotInputShape = {
614
+ target: z
615
+ .union([z.string(), z.number()])
616
+ .optional()
617
+ .describe("Target VM ID or name to rollback (e.g. '105')."),
618
+ vmIdOrName: z
619
+ .union([z.string(), z.number()])
620
+ .optional()
621
+ .describe("Alias for target."),
622
+ snapshotName: z
623
+ .string()
624
+ .describe("Name of the snapshot to rollback / revert to (e.g. 'clean-base')."),
625
+ host: z
626
+ .enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "auto"])
627
+ .optional()
628
+ .default("auto")
629
+ .describe("Hypervisor host or 'auto'.")
630
+ };
631
+ export const RollbackSnapshotInputSchema = z
632
+ .object(RollbackSnapshotInputShape)
633
+ .refine((data) => Boolean(data.target || data.vmIdOrName), { message: "VM target ('target' or 'vmIdOrName') is required." });
634
+ export async function handleRollbackSnapshot(args, context) {
635
+ const parsed = RollbackSnapshotInputSchema.safeParse(args || {});
636
+ if (!parsed.success) {
637
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for rollback_snapshot.");
638
+ }
639
+ const target = parsed.data.target || parsed.data.vmIdOrName;
640
+ const { snapshotName, host: targetHost } = parsed.data;
641
+ const drivers = context.hypervisorManager?.getAllDrivers() || [];
642
+ let foundDriver = targetHost && targetHost !== "auto"
643
+ ? drivers.find(d => d.hostName === targetHost || (targetHost === "proxmox-mini" && d.hostName === "proxmox-minis-lab"))
644
+ : null;
645
+ let vmRecord = null;
646
+ if (foundDriver) {
647
+ vmRecord = await foundDriver.getVm(target);
648
+ }
649
+ else {
650
+ for (const d of drivers) {
651
+ const vm = await d.getVm(target);
652
+ if (vm) {
653
+ foundDriver = d;
654
+ vmRecord = vm;
655
+ break;
656
+ }
657
+ }
658
+ }
659
+ if (!foundDriver || !vmRecord) {
660
+ return createToolErrorResult(ProxmoxErrorCode.VM_NOT_FOUND, `VM '${target}' not found.`);
661
+ }
662
+ if (!foundDriver.rollbackSnapshot) {
663
+ return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${foundDriver.hostName}' does not support rollbackSnapshot.`);
664
+ }
665
+ try {
666
+ await foundDriver.rollbackSnapshot(vmRecord.id, snapshotName);
667
+ telemetry.emit({
668
+ event: "storage.rollback_snapshot",
669
+ actor: "ct-lab-mcp",
670
+ status: "success",
671
+ hostId: foundDriver.hostName,
672
+ vmId: vmRecord.id,
673
+ metadata: { snapshotName }
674
+ });
675
+ return {
676
+ content: [{ type: "text", text: `### 🔄 Snapshot Rollback Completed\n\nVM **${vmRecord.name}** (\`${vmRecord.id}\`) on host \`${foundDriver.hostName}\` was reverted to snapshot **\`${snapshotName}\`**.` }],
677
+ structuredContent: { success: true, host: foundDriver.hostName, vmId: vmRecord.id, vmName: vmRecord.name, snapshotName }
678
+ };
679
+ }
680
+ catch (err) {
681
+ const msg = err instanceof Error ? err.message : String(err);
682
+ return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to rollback snapshot '${snapshotName}' on VM '${target}': ${msg}`);
683
+ }
684
+ }
265
685
  //# sourceMappingURL=storage-tools.js.map