@calltelemetry/ct-lab-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -0
  3. package/dist/bin/ct-lab-mcp.d.ts +60 -0
  4. package/dist/bin/ct-lab-mcp.d.ts.map +1 -0
  5. package/dist/bin/ct-lab-mcp.js +261 -0
  6. package/dist/bin/ct-lab-mcp.js.map +1 -0
  7. package/dist/bin/proxmox-mcp.d.ts +58 -0
  8. package/dist/bin/proxmox-mcp.d.ts.map +1 -0
  9. package/dist/bin/proxmox-mcp.js +248 -0
  10. package/dist/bin/proxmox-mcp.js.map +1 -0
  11. package/dist/src/appliance/commands.d.ts +33 -0
  12. package/dist/src/appliance/commands.d.ts.map +1 -0
  13. package/dist/src/appliance/commands.js +241 -0
  14. package/dist/src/appliance/commands.js.map +1 -0
  15. package/dist/src/appliance/executor.d.ts +34 -0
  16. package/dist/src/appliance/executor.d.ts.map +1 -0
  17. package/dist/src/appliance/executor.js +214 -0
  18. package/dist/src/appliance/executor.js.map +1 -0
  19. package/dist/src/appliance/index.d.ts +8 -0
  20. package/dist/src/appliance/index.d.ts.map +1 -0
  21. package/dist/src/appliance/index.js +8 -0
  22. package/dist/src/appliance/index.js.map +1 -0
  23. package/dist/src/appliance/mock.d.ts +66 -0
  24. package/dist/src/appliance/mock.d.ts.map +1 -0
  25. package/dist/src/appliance/mock.js +339 -0
  26. package/dist/src/appliance/mock.js.map +1 -0
  27. package/dist/src/appliance/types.d.ts +83 -0
  28. package/dist/src/appliance/types.d.ts.map +1 -0
  29. package/dist/src/appliance/types.js +58 -0
  30. package/dist/src/appliance/types.js.map +1 -0
  31. package/dist/src/credentials/doppler.d.ts +25 -0
  32. package/dist/src/credentials/doppler.d.ts.map +1 -0
  33. package/dist/src/credentials/doppler.js +68 -0
  34. package/dist/src/credentials/doppler.js.map +1 -0
  35. package/dist/src/credentials/index.d.ts +4 -0
  36. package/dist/src/credentials/index.d.ts.map +1 -0
  37. package/dist/src/credentials/index.js +4 -0
  38. package/dist/src/credentials/index.js.map +1 -0
  39. package/dist/src/credentials/resolver.d.ts +36 -0
  40. package/dist/src/credentials/resolver.d.ts.map +1 -0
  41. package/dist/src/credentials/resolver.js +427 -0
  42. package/dist/src/credentials/resolver.js.map +1 -0
  43. package/dist/src/credentials/types.d.ts +73 -0
  44. package/dist/src/credentials/types.d.ts.map +1 -0
  45. package/dist/src/credentials/types.js +5 -0
  46. package/dist/src/credentials/types.js.map +1 -0
  47. package/dist/src/guardrails/index.d.ts +3 -0
  48. package/dist/src/guardrails/index.d.ts.map +1 -0
  49. package/dist/src/guardrails/index.js +3 -0
  50. package/dist/src/guardrails/index.js.map +1 -0
  51. package/dist/src/guardrails/safety.d.ts +45 -0
  52. package/dist/src/guardrails/safety.d.ts.map +1 -0
  53. package/dist/src/guardrails/safety.js +217 -0
  54. package/dist/src/guardrails/safety.js.map +1 -0
  55. package/dist/src/guardrails/types.d.ts +36 -0
  56. package/dist/src/guardrails/types.d.ts.map +1 -0
  57. package/dist/src/guardrails/types.js +20 -0
  58. package/dist/src/guardrails/types.js.map +1 -0
  59. package/dist/src/hypervisors/esxi/client.d.ts +103 -0
  60. package/dist/src/hypervisors/esxi/client.d.ts.map +1 -0
  61. package/dist/src/hypervisors/esxi/client.js +395 -0
  62. package/dist/src/hypervisors/esxi/client.js.map +1 -0
  63. package/dist/src/hypervisors/esxi/mock.d.ts +45 -0
  64. package/dist/src/hypervisors/esxi/mock.d.ts.map +1 -0
  65. package/dist/src/hypervisors/esxi/mock.js +202 -0
  66. package/dist/src/hypervisors/esxi/mock.js.map +1 -0
  67. package/dist/src/hypervisors/index.d.ts +10 -0
  68. package/dist/src/hypervisors/index.d.ts.map +1 -0
  69. package/dist/src/hypervisors/index.js +10 -0
  70. package/dist/src/hypervisors/index.js.map +1 -0
  71. package/dist/src/hypervisors/manager.d.ts +78 -0
  72. package/dist/src/hypervisors/manager.d.ts.map +1 -0
  73. package/dist/src/hypervisors/manager.js +415 -0
  74. package/dist/src/hypervisors/manager.js.map +1 -0
  75. package/dist/src/hypervisors/proxmox/client.d.ts +29 -0
  76. package/dist/src/hypervisors/proxmox/client.d.ts.map +1 -0
  77. package/dist/src/hypervisors/proxmox/client.js +278 -0
  78. package/dist/src/hypervisors/proxmox/client.js.map +1 -0
  79. package/dist/src/hypervisors/proxmox/mock.d.ts +17 -0
  80. package/dist/src/hypervisors/proxmox/mock.d.ts.map +1 -0
  81. package/dist/src/hypervisors/proxmox/mock.js +26 -0
  82. package/dist/src/hypervisors/proxmox/mock.js.map +1 -0
  83. package/dist/src/hypervisors/types.d.ts +159 -0
  84. package/dist/src/hypervisors/types.d.ts.map +1 -0
  85. package/dist/src/hypervisors/types.js +6 -0
  86. package/dist/src/hypervisors/types.js.map +1 -0
  87. package/dist/src/index.d.ts +19 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +19 -0
  90. package/dist/src/index.js.map +1 -0
  91. package/dist/src/proxmox/client.d.ts +37 -0
  92. package/dist/src/proxmox/client.d.ts.map +1 -0
  93. package/dist/src/proxmox/client.js +282 -0
  94. package/dist/src/proxmox/client.js.map +1 -0
  95. package/dist/src/proxmox/index.d.ts +53 -0
  96. package/dist/src/proxmox/index.d.ts.map +1 -0
  97. package/dist/src/proxmox/index.js +109 -0
  98. package/dist/src/proxmox/index.js.map +1 -0
  99. package/dist/src/proxmox/mock.d.ts +40 -0
  100. package/dist/src/proxmox/mock.d.ts.map +1 -0
  101. package/dist/src/proxmox/mock.js +362 -0
  102. package/dist/src/proxmox/mock.js.map +1 -0
  103. package/dist/src/proxmox/poller.d.ts +29 -0
  104. package/dist/src/proxmox/poller.d.ts.map +1 -0
  105. package/dist/src/proxmox/poller.js +107 -0
  106. package/dist/src/proxmox/poller.js.map +1 -0
  107. package/dist/src/server/index.d.ts +2 -0
  108. package/dist/src/server/index.d.ts.map +1 -0
  109. package/dist/src/server/index.js +2 -0
  110. package/dist/src/server/index.js.map +1 -0
  111. package/dist/src/server/mcp-server.d.ts +5 -0
  112. package/dist/src/server/mcp-server.d.ts.map +1 -0
  113. package/dist/src/server/mcp-server.js +5 -0
  114. package/dist/src/server/mcp-server.js.map +1 -0
  115. package/dist/src/server.d.ts +35 -0
  116. package/dist/src/server.d.ts.map +1 -0
  117. package/dist/src/server.js +95 -0
  118. package/dist/src/server.js.map +1 -0
  119. package/dist/src/slot/gc.d.ts +42 -0
  120. package/dist/src/slot/gc.d.ts.map +1 -0
  121. package/dist/src/slot/gc.js +79 -0
  122. package/dist/src/slot/gc.js.map +1 -0
  123. package/dist/src/slot/index.d.ts +4 -0
  124. package/dist/src/slot/index.d.ts.map +1 -0
  125. package/dist/src/slot/index.js +4 -0
  126. package/dist/src/slot/index.js.map +1 -0
  127. package/dist/src/slot/manager.d.ts +92 -0
  128. package/dist/src/slot/manager.d.ts.map +1 -0
  129. package/dist/src/slot/manager.js +650 -0
  130. package/dist/src/slot/manager.js.map +1 -0
  131. package/dist/src/slot/types.d.ts +184 -0
  132. package/dist/src/slot/types.d.ts.map +1 -0
  133. package/dist/src/slot/types.js +67 -0
  134. package/dist/src/slot/types.js.map +1 -0
  135. package/dist/src/tools/appliance-exec.d.ts +81 -0
  136. package/dist/src/tools/appliance-exec.d.ts.map +1 -0
  137. package/dist/src/tools/appliance-exec.js +134 -0
  138. package/dist/src/tools/appliance-exec.js.map +1 -0
  139. package/dist/src/tools/claim-slot.d.ts +5 -0
  140. package/dist/src/tools/claim-slot.d.ts.map +1 -0
  141. package/dist/src/tools/claim-slot.js +5 -0
  142. package/dist/src/tools/claim-slot.js.map +1 -0
  143. package/dist/src/tools/index.d.ts +26 -0
  144. package/dist/src/tools/index.d.ts.map +1 -0
  145. package/dist/src/tools/index.js +63 -0
  146. package/dist/src/tools/index.js.map +1 -0
  147. package/dist/src/tools/list-hosts.d.ts +41 -0
  148. package/dist/src/tools/list-hosts.d.ts.map +1 -0
  149. package/dist/src/tools/list-hosts.js +91 -0
  150. package/dist/src/tools/list-hosts.js.map +1 -0
  151. package/dist/src/tools/list-inventory.d.ts +50 -0
  152. package/dist/src/tools/list-inventory.d.ts.map +1 -0
  153. package/dist/src/tools/list-inventory.js +112 -0
  154. package/dist/src/tools/list-inventory.js.map +1 -0
  155. package/dist/src/tools/list-slots.d.ts +5 -0
  156. package/dist/src/tools/list-slots.d.ts.map +1 -0
  157. package/dist/src/tools/list-slots.js +5 -0
  158. package/dist/src/tools/list-slots.js.map +1 -0
  159. package/dist/src/tools/provision-tools.d.ts +231 -0
  160. package/dist/src/tools/provision-tools.d.ts.map +1 -0
  161. package/dist/src/tools/provision-tools.js +289 -0
  162. package/dist/src/tools/provision-tools.js.map +1 -0
  163. package/dist/src/tools/release-slot.d.ts +5 -0
  164. package/dist/src/tools/release-slot.d.ts.map +1 -0
  165. package/dist/src/tools/release-slot.js +5 -0
  166. package/dist/src/tools/release-slot.js.map +1 -0
  167. package/dist/src/tools/slot-tools.d.ts +173 -0
  168. package/dist/src/tools/slot-tools.d.ts.map +1 -0
  169. package/dist/src/tools/slot-tools.js +296 -0
  170. package/dist/src/tools/slot-tools.js.map +1 -0
  171. package/dist/src/tools/vm-action.d.ts +189 -0
  172. package/dist/src/tools/vm-action.d.ts.map +1 -0
  173. package/dist/src/tools/vm-action.js +300 -0
  174. package/dist/src/tools/vm-action.js.map +1 -0
  175. package/dist/src/transports/index.d.ts +3 -0
  176. package/dist/src/transports/index.d.ts.map +1 -0
  177. package/dist/src/transports/index.js +3 -0
  178. package/dist/src/transports/index.js.map +1 -0
  179. package/dist/src/transports/sse.d.ts +38 -0
  180. package/dist/src/transports/sse.d.ts.map +1 -0
  181. package/dist/src/transports/sse.js +167 -0
  182. package/dist/src/transports/sse.js.map +1 -0
  183. package/dist/src/transports/stdio.d.ts +15 -0
  184. package/dist/src/transports/stdio.d.ts.map +1 -0
  185. package/dist/src/transports/stdio.js +34 -0
  186. package/dist/src/transports/stdio.js.map +1 -0
  187. package/dist/src/types/config.d.ts +17 -0
  188. package/dist/src/types/config.d.ts.map +1 -0
  189. package/dist/src/types/config.js +5 -0
  190. package/dist/src/types/config.js.map +1 -0
  191. package/dist/src/types/index.d.ts +4 -0
  192. package/dist/src/types/index.d.ts.map +1 -0
  193. package/dist/src/types/index.js +4 -0
  194. package/dist/src/types/index.js.map +1 -0
  195. package/dist/src/types/mcp.d.ts +38 -0
  196. package/dist/src/types/mcp.d.ts.map +1 -0
  197. package/dist/src/types/mcp.js +46 -0
  198. package/dist/src/types/mcp.js.map +1 -0
  199. package/dist/src/types/proxmox.d.ts +181 -0
  200. package/dist/src/types/proxmox.d.ts.map +1 -0
  201. package/dist/src/types/proxmox.js +5 -0
  202. package/dist/src/types/proxmox.js.map +1 -0
  203. package/dist/src/types/slot.d.ts +5 -0
  204. package/dist/src/types/slot.d.ts.map +1 -0
  205. package/dist/src/types/slot.js +5 -0
  206. package/dist/src/types/slot.js.map +1 -0
  207. package/dist/src/utils/formatters.d.ts +71 -0
  208. package/dist/src/utils/formatters.d.ts.map +1 -0
  209. package/dist/src/utils/formatters.js +480 -0
  210. package/dist/src/utils/formatters.js.map +1 -0
  211. package/dist/src/utils/index.d.ts +6 -0
  212. package/dist/src/utils/index.d.ts.map +1 -0
  213. package/dist/src/utils/index.js +6 -0
  214. package/dist/src/utils/index.js.map +1 -0
  215. package/dist/src/utils/logger.d.ts +28 -0
  216. package/dist/src/utils/logger.d.ts.map +1 -0
  217. package/dist/src/utils/logger.js +74 -0
  218. package/dist/src/utils/logger.js.map +1 -0
  219. package/dist/src/utils/mutex.d.ts +32 -0
  220. package/dist/src/utils/mutex.d.ts.map +1 -0
  221. package/dist/src/utils/mutex.js +86 -0
  222. package/dist/src/utils/mutex.js.map +1 -0
  223. package/dist/src/utils/redact.d.ts +6 -0
  224. package/dist/src/utils/redact.d.ts.map +1 -0
  225. package/dist/src/utils/redact.js +6 -0
  226. package/dist/src/utils/redact.js.map +1 -0
  227. package/dist/src/utils/redactor.d.ts +50 -0
  228. package/dist/src/utils/redactor.d.ts.map +1 -0
  229. package/dist/src/utils/redactor.js +170 -0
  230. package/dist/src/utils/redactor.js.map +1 -0
  231. package/package.json +75 -0
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Safety Guardrails Engine
3
+ * Protects core infrastructure, persistent fixtures, and template VMs against disruptive or destructive operations.
4
+ * Enforces non-bypassable guardrails across Proxmox VE and VMware ESXi.
5
+ */
6
+ import { ProtectedVmViolationError } from "./types.js";
7
+ export * from "./types.js";
8
+ export class SafetyGuardrailEngine {
9
+ protectedVmIds;
10
+ protectedNamePatterns;
11
+ protectedTags;
12
+ constructor(customProtectedVmIds = [], options = {}) {
13
+ // Standard protected core lab fixtures across Proxmox VE & VMware ESXi
14
+ this.protectedVmIds = new Set([
15
+ // Proxmox Core Fixtures
16
+ 100, // OpenClaw1
17
+ 101, // ctclaw
18
+ 102, // 0.8.7-stable / import fixture
19
+ 103, // CUBE voice gateways
20
+ 104, // CUCM15-PMX-PUBLISHER
21
+ // VMware ESXi Core Fixtures
22
+ "CUCM14-01-6-30",
23
+ "CUCM15-01-6-29",
24
+ "CUCM15-02-6-30",
25
+ "CUCM-115Cluster1",
26
+ "CUBE-8000V-[SIP-LAB]-cube-lab",
27
+ "GH-Runner",
28
+ "LAB-K8S-192.168.125.118",
29
+ "CT-087-STABLE-TEMPLATE",
30
+ "CT-ALMALINUX9-TEMPLATE",
31
+ "CT-ALMALINUX9-MINI-TEMPLATE",
32
+ ...customProtectedVmIds,
33
+ ...(options.customProtectedVmIds || [])
34
+ ]);
35
+ this.protectedNamePatterns = [
36
+ /^(cucm|cube|cat8000v|openclaw|ctclaw|infra|pve|gh-runner|lab-k8s)/i,
37
+ /(publisher|subscriber|golden|base-template|persistent)/i,
38
+ /^template-/i,
39
+ /cucm/i,
40
+ /cube/i,
41
+ /cat8000v/i,
42
+ /gh-runner/i,
43
+ /lab-k8s/i,
44
+ /almalinux.*template/i,
45
+ /stable.*template/i,
46
+ ...(options.customProtectedPatterns || [])
47
+ ];
48
+ this.protectedTags = new Set([
49
+ "protected",
50
+ "persistent",
51
+ "fixture",
52
+ "infra",
53
+ "cucm",
54
+ "cube",
55
+ "production",
56
+ "do-not-delete",
57
+ "runner",
58
+ "ci",
59
+ "k8s",
60
+ "golden",
61
+ "cat8000v",
62
+ "voice",
63
+ ...(options.customProtectedTags || []).map((t) => t.toLowerCase().trim())
64
+ ]);
65
+ }
66
+ /**
67
+ * Check whether a VM is considered protected by ID, template flag, name, tag, or note.
68
+ */
69
+ isProtected(vm) {
70
+ const vmName = vm.name || `VM-${vm.vmid}`;
71
+ const vmidStr = String(vm.vmid).trim();
72
+ const vmidNum = typeof vm.vmid === "number" ? vm.vmid : parseInt(vmidStr, 10);
73
+ // 1. Check explicit protected VMID (number or string identifier)
74
+ if (this.protectedVmIds.has(vm.vmid) || this.protectedVmIds.has(vmidStr)) {
75
+ return {
76
+ protected: true,
77
+ reason: `VMID ${vm.vmid} is in the explicit protected core infrastructure list (e.g. CUCM/fixtures)`
78
+ };
79
+ }
80
+ // 2. Check numeric template VMID range (9000-9999) for Proxmox
81
+ if (!isNaN(vmidNum) && vmidNum >= 9000 && vmidNum <= 9999) {
82
+ return {
83
+ protected: true,
84
+ reason: `VMID ${vm.vmid} falls within the reserved template VMID range (9000-9999)`
85
+ };
86
+ }
87
+ // 3. Check Proxmox/ESXi template flag
88
+ if (vm.template === true ||
89
+ vm.template === 1 ||
90
+ vm.template === "1" ||
91
+ vm.template === "true" ||
92
+ vm.isTemplate === true) {
93
+ return {
94
+ protected: true,
95
+ reason: `VM ${vm.vmid} ('${vmName}') is configured as a Proxmox VM template`
96
+ };
97
+ }
98
+ // 4. Check explicit isProtected flag
99
+ if (vm.isProtected === true) {
100
+ return {
101
+ protected: true,
102
+ reason: vm.protectionReason || `VM ${vm.vmid} ('${vmName}') has explicit protection flag enabled`
103
+ };
104
+ }
105
+ // 5. Check name patterns
106
+ if (vm.name) {
107
+ for (const pattern of this.protectedNamePatterns) {
108
+ if (pattern.test(vm.name)) {
109
+ return {
110
+ protected: true,
111
+ reason: `VM name '${vm.name}' matches protected pattern ${pattern}`
112
+ };
113
+ }
114
+ }
115
+ }
116
+ // 6. Check protected tags
117
+ const tags = this.normalizeTags(vm.tags);
118
+ for (const tag of tags) {
119
+ if (this.protectedTags.has(tag)) {
120
+ return {
121
+ protected: true,
122
+ reason: `VM ${vm.vmid} contains protected tag '${tag}'`
123
+ };
124
+ }
125
+ }
126
+ // 7. Check protected annotations / notes
127
+ if (vm.notes) {
128
+ const notesLower = vm.notes.toLowerCase();
129
+ if (notesLower.includes("never destroy") ||
130
+ notesLower.includes("do not stop") ||
131
+ notesLower.includes("do not delete") ||
132
+ notesLower.includes("protected") ||
133
+ notesLower.includes("core server") ||
134
+ notesLower.includes("required for tests") ||
135
+ notesLower.includes("core infrastructure")) {
136
+ return {
137
+ protected: true,
138
+ reason: `VM ${vm.vmid} notes indicate protected status ('${vm.notes.trim()}')`
139
+ };
140
+ }
141
+ }
142
+ return { protected: false };
143
+ }
144
+ /**
145
+ * Validates if the requested action is permitted on the target VM.
146
+ * Throws ProtectedVmViolationError if a destructive/disruptive action is attempted on a protected VM.
147
+ * This check is NON-BYPASSABLE, even if force === true.
148
+ */
149
+ validateAction(vm, action, _force = false) {
150
+ const normalizedAction = (action || "").toLowerCase().trim();
151
+ const vmName = vm.name || `VM-${vm.vmid}`;
152
+ // Read-only actions and start (power on) are permitted
153
+ const isSafeAction = ["status", "config", "rrddata", "start"].includes(normalizedAction);
154
+ if (isSafeAction) {
155
+ return;
156
+ }
157
+ const protection = this.isProtected(vm);
158
+ if (protection.protected) {
159
+ // Destructive and disruptive actions are ALWAYS rejected on protected VMs
160
+ const isDisruptiveOrDestructive = [
161
+ "stop",
162
+ "shutdown",
163
+ "reboot",
164
+ "reset",
165
+ "suspend",
166
+ "destroy",
167
+ "delete",
168
+ "force-stop"
169
+ ].includes(normalizedAction);
170
+ if (isDisruptiveOrDestructive) {
171
+ throw new ProtectedVmViolationError(vm.vmid, vmName, normalizedAction, protection.reason || "Protected infrastructure policy");
172
+ }
173
+ }
174
+ }
175
+ /**
176
+ * Helper to normalize tags from array or delimited string.
177
+ */
178
+ normalizeTags(tags) {
179
+ if (!tags)
180
+ return [];
181
+ if (Array.isArray(tags)) {
182
+ return tags.map((t) => t.toLowerCase().trim()).filter(Boolean);
183
+ }
184
+ return tags
185
+ .split(/[;, ]+/)
186
+ .map((t) => t.toLowerCase().trim())
187
+ .filter(Boolean);
188
+ }
189
+ /**
190
+ * Add additional protected VMID at runtime.
191
+ */
192
+ addProtectedVmId(vmid) {
193
+ this.protectedVmIds.add(vmid);
194
+ }
195
+ /**
196
+ * Get list of all explicitly protected VMIDs.
197
+ */
198
+ getProtectedVmIds() {
199
+ return Array.from(this.protectedVmIds).sort((a, b) => {
200
+ if (typeof a === "number" && typeof b === "number")
201
+ return a - b;
202
+ return String(a).localeCompare(String(b));
203
+ });
204
+ }
205
+ }
206
+ /**
207
+ * Default global instance of SafetyGuardrailEngine
208
+ */
209
+ export const defaultSafetyGuardrailEngine = new SafetyGuardrailEngine();
210
+ /**
211
+ * Convenience function conforming to PROJECT.md interface contract:
212
+ * assertActionPermitted(vm, action, force)
213
+ */
214
+ export function assertActionPermitted(vm, action, force = false, engine = defaultSafetyGuardrailEngine) {
215
+ engine.validateAction(vm, action, force);
216
+ }
217
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/guardrails/safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Safety Guardrails Engine Data Types
3
+ */
4
+ import { HostId } from "../slot/types.js";
5
+ export interface VmTarget {
6
+ vmid: number | string;
7
+ name?: string;
8
+ template?: boolean | number | string;
9
+ tags?: string[] | string;
10
+ notes?: string;
11
+ hostId?: HostId;
12
+ hypervisorType?: "proxmox" | "esxi";
13
+ isTemplate?: boolean;
14
+ isProtected?: boolean;
15
+ protectionReason?: string;
16
+ }
17
+ export type VmActionType = "status" | "config" | "rrddata" | "start" | "stop" | "shutdown" | "reboot" | "reset" | "suspend" | "destroy" | "delete" | "clone" | string;
18
+ export declare class ProtectedVmViolationError extends Error {
19
+ readonly code = "PROTECTED_VM_VIOLATION";
20
+ readonly vmid: number | string;
21
+ readonly vmName: string;
22
+ readonly action: string;
23
+ readonly reason: string;
24
+ constructor(vmid: number | string, vmName: string, action: string, reason: string);
25
+ }
26
+ export interface ProtectionCheckResult {
27
+ protected: boolean;
28
+ reason?: string;
29
+ }
30
+ export interface SafetyGuardrailOptions {
31
+ customProtectedVmIds?: (number | string)[];
32
+ customProtectedNames?: string[];
33
+ customProtectedPatterns?: RegExp[];
34
+ customProtectedTags?: string[];
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/guardrails/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,OAAO,GACP,MAAM,GACN,UAAU,GACV,QAAQ,GACR,OAAO,GACP,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,GACP,MAAM,CAAC;AAEX,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CASlF;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,oBAAoB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC3C,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Safety Guardrails Engine Data Types
3
+ */
4
+ export class ProtectedVmViolationError extends Error {
5
+ code = "PROTECTED_VM_VIOLATION";
6
+ vmid;
7
+ vmName;
8
+ action;
9
+ reason;
10
+ constructor(vmid, vmName, action, reason) {
11
+ const message = `PROTECTED_VM_VIOLATION: Cannot execute '${action}' on protected VM ${vmid} ('${vmName}'). Reason: ${reason}. Destructive/disruptive operations on protected infrastructure are strictly forbidden.`;
12
+ super(message);
13
+ this.name = "ProtectedVmViolationError";
14
+ this.vmid = vmid;
15
+ this.vmName = vmName;
16
+ this.action = action;
17
+ this.reason = reason;
18
+ }
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/guardrails/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,wBAAwB,CAAC;IAChC,IAAI,CAAkB;IACtB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,MAAM,CAAS;IAExB,YAAY,IAAqB,EAAE,MAAc,EAAE,MAAc,EAAE,MAAc;QAC/E,MAAM,OAAO,GAAG,2CAA2C,MAAM,qBAAqB,IAAI,MAAM,MAAM,eAAe,MAAM,yFAAyF,CAAC;QACrN,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * VMware ESXi Hypervisor Driver
3
+ * Implements IHypervisorDriver for VMware ESXi standalone and vCenter managed hosts.
4
+ * Supports govc CLI execution and VMware REST/SOAP API fallback.
5
+ */
6
+ import { IHypervisorDriver, HostCapacity, UnifiedVmRecord, CloneVmParams, ProvisionVmResult } from "../types.js";
7
+ import { EsxiHostConfig } from "../../credentials/types.js";
8
+ import { SafetyGuardrailEngine } from "../../guardrails/safety.js";
9
+ export interface EsxiVmSummary {
10
+ name: string;
11
+ path: string;
12
+ powerState: "poweredOn" | "poweredOff" | "suspended" | "unknown";
13
+ memoryMb: number;
14
+ cpuCores: number;
15
+ ipAddress?: string;
16
+ isTemplate: boolean;
17
+ annotation?: string;
18
+ tags?: string[];
19
+ }
20
+ export interface IEsxiClient {
21
+ readonly hostConfig: EsxiHostConfig;
22
+ getHostSummary(): Promise<{
23
+ cpuCores: number;
24
+ cpuUsageMhz?: number;
25
+ memoryTotalMb: number;
26
+ memoryUsedMb: number;
27
+ datastoreTotalGb: number;
28
+ datastoreFreeGb: number;
29
+ }>;
30
+ listVms(): Promise<EsxiVmSummary[]>;
31
+ getVm(vmName: string): Promise<EsxiVmSummary | null>;
32
+ cloneVm(sourceVmName: string, targetVmName: string, options?: {
33
+ memoryMb?: number;
34
+ cpuCores?: number;
35
+ datastore?: string;
36
+ network?: string;
37
+ }): Promise<{
38
+ success: boolean;
39
+ taskRef?: string;
40
+ vmName: string;
41
+ }>;
42
+ startVm(vmName: string): Promise<void>;
43
+ stopVm(vmName: string, force?: boolean): Promise<void>;
44
+ rebootVm(vmName: string): Promise<void>;
45
+ destroyVm(vmName: string): Promise<void>;
46
+ }
47
+ /**
48
+ * Real govc execution client
49
+ */
50
+ export declare class GovcClient implements IEsxiClient {
51
+ readonly hostConfig: EsxiHostConfig;
52
+ constructor(hostConfig: EsxiHostConfig);
53
+ private getGovcEnv;
54
+ private execGovc;
55
+ getHostSummary(): Promise<{
56
+ cpuCores: number;
57
+ cpuUsageMhz?: number;
58
+ memoryTotalMb: number;
59
+ memoryUsedMb: number;
60
+ datastoreTotalGb: number;
61
+ datastoreFreeGb: number;
62
+ }>;
63
+ listVms(): Promise<EsxiVmSummary[]>;
64
+ getVm(vmName: string): Promise<EsxiVmSummary | null>;
65
+ cloneVm(sourceVmName: string, targetVmName: string, options?: {
66
+ memoryMb?: number;
67
+ cpuCores?: number;
68
+ datastore?: string;
69
+ network?: string;
70
+ }): Promise<{
71
+ success: boolean;
72
+ taskRef?: string;
73
+ vmName: string;
74
+ }>;
75
+ startVm(vmName: string): Promise<void>;
76
+ stopVm(vmName: string, force?: boolean): Promise<void>;
77
+ rebootVm(vmName: string): Promise<void>;
78
+ destroyVm(vmName: string): Promise<void>;
79
+ }
80
+ /**
81
+ * VMware ESXi Hypervisor Driver implementing polymorphic IHypervisorDriver
82
+ */
83
+ export declare class EsxiDriver implements IHypervisorDriver {
84
+ readonly hostName: string;
85
+ readonly hypervisorType: "esxi";
86
+ readonly hostConfig: EsxiHostConfig;
87
+ private client;
88
+ private safetyEngine;
89
+ constructor(hostConfig: EsxiHostConfig, client?: IEsxiClient, safetyEngine?: SafetyGuardrailEngine);
90
+ get rawClient(): IEsxiClient;
91
+ getHostCapacity(): Promise<HostCapacity>;
92
+ listVms(): Promise<UnifiedVmRecord[]>;
93
+ getVm(vmIdOrName: string | number): Promise<UnifiedVmRecord | null>;
94
+ cloneVm(params: CloneVmParams): Promise<ProvisionVmResult>;
95
+ startVm(vmIdOrName: string | number): Promise<void>;
96
+ stopVm(vmIdOrName: string | number, force?: boolean): Promise<void>;
97
+ rebootVm(vmIdOrName: string | number): Promise<void>;
98
+ destroyVm(vmIdOrName: string | number): Promise<void>;
99
+ private isProtectedVmName;
100
+ private validateSafety;
101
+ private mapToUnifiedVm;
102
+ }
103
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/hypervisors/esxi/client.ts"],"names":[],"mappings":"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"}