@calltelemetry/ct-lab-mcp 0.8.134 → 0.8.136

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.
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Claimed published OVA import. The canonical lab-inventory CLI owns every
3
+ * release, OVF, Proxmox, CPU, journal, and receipt decision; this facade only
4
+ * creates/reads the actual ApplianceClaim and passes its live UID through.
5
+ */
6
+ import { z } from "zod";
7
+ import { createHash } from "node:crypto";
8
+ import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
9
+ import { canonicalOperationAvailable, IMPORT_BRIDGE_UNAVAILABLE_REMEDY, runCanonicalOperation } from "./canonical-guard.js";
10
+ import { guardCanonicalThinStorage } from "./thin-storage-policy.js";
11
+ import { awaitClaimReconciled, claimNotReconciledResult, claimReconcileTimeoutMs } from "./claim-reconcile-gate.js";
12
+ import { reservedIdentityError } from "./sha-channel.js";
13
+ import { buildApplianceClaimManifest, CreateApplianceClaimInputSchema, handleDeleteApplianceClaim, handleCreateApplianceClaim, handleGetApplianceClaim, normalizeClaimNode, } from "./appliance-claim-tools.js";
14
+ import { normalizeProxmoxHost, PROXMOX_HOST_CLAIM_NODES, PROXMOX_HOST_INPUTS, } from "./proxmox-host-policy.js";
15
+ import { LAB_RELEASES_R2_RO_ENV_NAMES, hasReleaseReadKey } from "../canonical/release-read-key.js";
16
+ const VERSION_PATTERN = /^(?:[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?:-rc[0-9]+)?)$/;
17
+ const SHA256_PATTERN = /^[a-f0-9]{64}$/;
18
+ const OS_VERSION_PATTERN = /^9\.[0-9]+$/;
19
+ const VM_PREFIX_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
20
+ const UUID_PATTERN = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i;
21
+ const PROXMOX_CLAIM_NODES = new Set(Object.values(PROXMOX_HOST_CLAIM_NODES));
22
+ function claimNodeForCanonicalProxmoxHost(hostAssetId) {
23
+ const raw = hostAssetId.trim().toLowerCase();
24
+ if (!PROXMOX_HOST_INPUTS.includes(raw))
25
+ return null;
26
+ const canonicalHost = normalizeProxmoxHost(raw);
27
+ return PROXMOX_HOST_CLAIM_NODES[canonicalHost] ?? null;
28
+ }
29
+ export const ClaimedImportOvaInputObjectSchema = z.object({
30
+ assetId: z.string().trim().min(1).describe("Exact canonical resulting asset ID; VMID, name, and IP selectors are not accepted."),
31
+ hostAssetId: z.string().trim().min(1).describe("Exact canonical Proxmox host asset ID."),
32
+ node: z.string().trim().min(1).describe("Canonical Proxmox claim node ('minis', 'proxmox', or 'ibm64'); must match hostAssetId."),
33
+ linearIssue: z.string().trim().regex(/^[A-Z][A-Z0-9]*-[1-9][0-9]*$/).describe("Linear issue owning this disposable guest."),
34
+ version: z.string().trim().regex(VERSION_PATTERN, "must be an exact published release version, including an RC suffix when applicable"),
35
+ osVersion: z.string().trim().regex(OS_VERSION_PATTERN, "must be the exact AlmaLinux 9 minor inside the OVA"),
36
+ operationId: z.string().trim().min(1).max(128).describe("Unique canonical provision idempotency key."),
37
+ receiptFile: z.string().trim().min(1).describe("Apply receipt path; the canonical CLI uses a separate preflight plan path."),
38
+ action: z.enum(["import", "recover", "finalize", "abandon"]).optional().default("import"),
39
+ vmid: z.number().int().positive().optional().describe("Reviewed Proxmox VMID; required for claim-first import."),
40
+ vmPrefix: z.string().trim().regex(VM_PREFIX_PATTERN).optional().describe("Exact DNS-safe Proxmox guest name and ApplianceClaim vmName."),
41
+ memoryMb: z.number().int().positive().optional().default(8192),
42
+ vcpus: z.number().int().positive().optional().default(4),
43
+ diskGb: z.number().int().positive().optional().default(200),
44
+ storage: z.string().trim().min(1).optional().describe("Thin-only VM image storage; thick or unknown storage is refused."),
45
+ importStorage: z.string().trim().min(1).optional().describe("File-based Proxmox import storage for the OVA."),
46
+ network: z.string().trim().min(1).optional().describe("Proxmox bridge."),
47
+ vlanTag: z.number().int().min(1).max(4094).optional(),
48
+ purpose: z.string().trim().regex(/^[A-Za-z0-9][A-Za-z0-9-]{1,31}$/).optional().default("appliance-uat"),
49
+ ttlHours: z.number().int().min(1).max(8760).optional().default(24).describe("Finite source-owned provision lease."),
50
+ claimName: z.string().trim().min(1).max(63).regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).optional(),
51
+ claimTtlHours: z.number().int().min(1).max(8760).optional().describe("Finite ApplianceClaim TTL; defaults to ttlHours."),
52
+ workspaceRoot: z.string().trim().min(1).optional().describe("Materialized ai-workspace root; defaults to CT_WORKSPACE_ROOT on the canonical controller."),
53
+ apply: z.boolean().optional().default(false).describe("Plan by default. Apply creates or reuses the exact Ready bare claim before the OVA import."),
54
+ confirmAssetId: z.string().trim().min(1).optional(),
55
+ confirmVmPrefix: z.string().trim().min(1).optional(),
56
+ confirmVmid: z.number().int().positive().optional(),
57
+ confirmOvaSha256: z.string().trim().regex(SHA256_PATTERN).optional().describe("Required on apply; exact OVA SHA-256 from the current canonical plan."),
58
+ confirmExistingSmbiosUuid: z.string().trim().regex(UUID_PATTERN).optional().describe("Required for finalize and for abandon only when the canonical plan finds an existing exact guest."),
59
+ }).strict();
60
+ export const ClaimedImportOvaInputSchema = ClaimedImportOvaInputObjectSchema.superRefine((value, context) => {
61
+ if (!value.apply)
62
+ return;
63
+ if (value.confirmAssetId !== value.assetId) {
64
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["confirmAssetId"], message: "must exactly match assetId when apply=true" });
65
+ }
66
+ if (value.vmPrefix === undefined || value.confirmVmPrefix !== value.vmPrefix) {
67
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["confirmVmPrefix"], message: "must exactly match the reviewed vmPrefix when apply=true" });
68
+ }
69
+ if (value.vmid === undefined || value.confirmVmid !== value.vmid) {
70
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["confirmVmid"], message: "must exactly match the reviewed vmid when apply=true" });
71
+ }
72
+ if (!value.confirmOvaSha256) {
73
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["confirmOvaSha256"], message: "is required when apply=true" });
74
+ }
75
+ if (value.action === "finalize" && !value.confirmExistingSmbiosUuid) {
76
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["confirmExistingSmbiosUuid"], message: "is required for exact existing-VM operations" });
77
+ }
78
+ });
79
+ const defaultDeps = {
80
+ createClaim: (args) => handleCreateApplianceClaim(args),
81
+ deleteClaim: (args, context) => handleDeleteApplianceClaim(args, context),
82
+ getClaim: (args, context) => handleGetApplianceClaim(args, context),
83
+ importCanonical: (args, context, timeoutMs) => runCanonicalOperation(context.canonicalBridge, "claimed_import_ova", args, timeoutMs),
84
+ awaitReady: (name, namespace, context) => awaitClaimReconciled(name, namespace, {
85
+ getClaim: (args) => handleGetApplianceClaim(args, context),
86
+ }),
87
+ };
88
+ function textOf(result) {
89
+ const block = result.content?.[0];
90
+ return block?.type === "text" ? block.text : "";
91
+ }
92
+ function claimOf(result) {
93
+ const raw = result.structuredContent;
94
+ if (raw?.claim && typeof raw.claim === "object")
95
+ return raw.claim;
96
+ try {
97
+ const parsed = JSON.parse(textOf(result));
98
+ return parsed?.claim && typeof parsed.claim === "object" ? parsed.claim : null;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ function fail(message, details) {
105
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, message, {
106
+ operation: "claimed_import_ova",
107
+ ...details,
108
+ });
109
+ }
110
+ function buildImportOvaArgs(value, claimName, receiptFile, claimUid, digest) {
111
+ const workspaceRoot = value.workspaceRoot ?? process.env.CT_WORKSPACE_ROOT;
112
+ if (!workspaceRoot)
113
+ throw new Error("workspaceRoot is required or CT_WORKSPACE_ROOT must be set on the canonical server");
114
+ const args = [
115
+ "vm", "provision", "--source", "published-ova",
116
+ "--asset-id", value.assetId, "--host-asset-id", value.hostAssetId,
117
+ "--linear-issue", value.linearIssue, "--version", value.version,
118
+ "--os-version", value.osVersion, "--workspace-root", workspaceRoot,
119
+ "--operation-id", value.operationId, "--receipt-file", receiptFile,
120
+ "--appliance-claim-name", claimName,
121
+ "--memory-mb", String(value.memoryMb), "--vcpus", String(value.vcpus),
122
+ "--disk-gb", String(value.diskGb), "--purpose", value.purpose,
123
+ "--ttl-hours", String(value.ttlHours),
124
+ ];
125
+ if (claimUid)
126
+ args.push("--appliance-claim-uid", claimUid);
127
+ if (value.vmid !== undefined)
128
+ args.push("--vmid", String(value.vmid));
129
+ if (value.vmPrefix)
130
+ args.push("--vm-prefix", value.vmPrefix);
131
+ if (value.storage)
132
+ args.push("--storage", value.storage);
133
+ if (value.importStorage)
134
+ args.push("--import-storage", value.importStorage);
135
+ if (value.network)
136
+ args.push("--network", value.network);
137
+ if (value.vlanTag !== undefined)
138
+ args.push("--vlan-tag", String(value.vlanTag));
139
+ if (value.action === "finalize")
140
+ args.push("--finalize-installed");
141
+ if (value.action === "recover")
142
+ args.push("--recover-incomplete");
143
+ if (value.action === "abandon")
144
+ args.push("--abandon");
145
+ if (value.confirmExistingSmbiosUuid)
146
+ args.push("--confirm-existing-smbios-uuid", value.confirmExistingSmbiosUuid);
147
+ if (value.apply) {
148
+ args.push("--apply", "--confirm-asset-id", value.confirmAssetId, "--confirm-vm-prefix", value.confirmVmPrefix, "--confirm-vmid", String(value.confirmVmid), "--confirm-published-ova-sha256", digest ?? value.confirmOvaSha256);
149
+ }
150
+ return args;
151
+ }
152
+ function parsePlan(result) {
153
+ const structured = result.structuredContent;
154
+ const value = structured?.result;
155
+ if (value && typeof value === "object" && !Array.isArray(value))
156
+ return value;
157
+ try {
158
+ const parsed = JSON.parse(textOf(result));
159
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
160
+ }
161
+ catch {
162
+ return null;
163
+ }
164
+ }
165
+ function planArtifact(plan, version) {
166
+ const artifact = plan?.os?.published_ova ?? plan?.published_ova;
167
+ const url = `https://download.calltelemetry.com/ct-${version}.ova`;
168
+ if (plan?.source !== "published-ova" || artifact?.version !== version || artifact?.url !== url
169
+ || typeof artifact?.sha256 !== "string" || !SHA256_PATTERN.test(artifact.sha256)
170
+ || !Number.isSafeInteger(artifact?.bytes) || artifact.bytes <= 0)
171
+ return null;
172
+ return { url, sha256: artifact.sha256, bytes: artifact.bytes };
173
+ }
174
+ function abandonPlanMismatch(plan, value, claimName, claimUid, artifact) {
175
+ if (plan.schema !== "calltelemetry-lab-vm-provision-abandon-plan/v1"
176
+ || plan.action !== "provision-abandon" || plan.source !== "published-ova"
177
+ || plan.apply !== false || plan.eligible !== true
178
+ || !Array.isArray(plan.blocking_reasons) || plan.blocking_reasons.length !== 0) {
179
+ return "canonical abandon plan is absent, ineligible, or ambiguous";
180
+ }
181
+ if (plan.asset_id !== value.assetId || plan.host_asset_id !== value.hostAssetId
182
+ || plan.linear_issue !== value.linearIssue || plan.operation_id !== value.operationId
183
+ || plan.vmid !== value.vmid || plan.appliance_claim_name !== claimName
184
+ || plan.appliance_claim_uid !== claimUid) {
185
+ return "canonical abandon plan does not bind the exact operation and Ready claim";
186
+ }
187
+ const expectedLeaseId = `lease-${createHash("sha256")
188
+ .update(`${value.assetId}:${value.linearIssue}:${value.operationId}`, "utf8")
189
+ .digest("hex").slice(0, 24)}`;
190
+ if (plan.lease_id !== expectedLeaseId) {
191
+ return "canonical abandon plan does not bind the original deterministic provision lease";
192
+ }
193
+ const source = plan.published_ova;
194
+ if (!source || source.version !== value.version || source.url !== artifact.url
195
+ || source.sha256 !== artifact.sha256 || source.bytes !== artifact.bytes) {
196
+ return "canonical abandon plan does not bind the exact original OVA source";
197
+ }
198
+ if (plan.cleanup_private_import_volume !== true || plan.release_only_after_absence !== true) {
199
+ return "canonical abandon plan lacks the exact private-volume cleanup and absence gates";
200
+ }
201
+ const confirmations = plan.required_confirmations;
202
+ if (!confirmations || confirmations.confirm_asset_id !== value.assetId
203
+ || confirmations.confirm_vmid !== value.vmid
204
+ || confirmations.confirm_published_ova_sha256 !== artifact.sha256) {
205
+ return "canonical abandon plan confirmations do not bind the exact source and guest request";
206
+ }
207
+ if (!Object.prototype.hasOwnProperty.call(plan, "existing_smbios_uuid")) {
208
+ return "canonical abandon plan does not prove whether the exact guest exists";
209
+ }
210
+ const liveUuid = plan.existing_smbios_uuid;
211
+ if (liveUuid === null) {
212
+ if (plan.destroy_pending_guest !== false
213
+ || Object.prototype.hasOwnProperty.call(confirmations, "confirm_existing_smbios_uuid")
214
+ || value.confirmExistingSmbiosUuid !== undefined) {
215
+ return "canonical abandon absence proof is incomplete or inconsistent";
216
+ }
217
+ return undefined;
218
+ }
219
+ if (typeof liveUuid !== "string" || !UUID_PATTERN.test(liveUuid)
220
+ || plan.destroy_pending_guest !== true
221
+ || confirmations.confirm_existing_smbios_uuid?.toLowerCase() !== liveUuid.toLowerCase()
222
+ || (value.confirmExistingSmbiosUuid !== undefined
223
+ && value.confirmExistingSmbiosUuid.toLowerCase() !== liveUuid.toLowerCase())
224
+ || (value.apply && !value.confirmExistingSmbiosUuid)) {
225
+ return "confirmExistingSmbiosUuid must match the current exact guest; unknown guest identity refuses abandon";
226
+ }
227
+ return undefined;
228
+ }
229
+ function existingClaimError(result, claimName, namespace) {
230
+ return result.isError === true
231
+ && textOf(result).includes(`ApplianceClaim '${claimName}' not found in namespace '${namespace}'`);
232
+ }
233
+ function claimMismatch(claim, expected) {
234
+ const meta = claim.metadata;
235
+ const spec = claim.spec;
236
+ if (meta.name !== expected.name || (meta.namespace ?? expected.namespace) !== expected.namespace)
237
+ return "name/namespace";
238
+ if (meta.deletionTimestamp)
239
+ return "deletionTimestamp";
240
+ if (spec.profile !== "bare" || (spec.claimType && spec.claimType !== "dynamic") || spec.paused === true)
241
+ return "profile/type/pause";
242
+ if (!Number.isInteger(spec.ttlHours) || (spec.ttlHours ?? 0) < 1
243
+ || (expected.ttlHours !== undefined && spec.ttlHours !== expected.ttlHours))
244
+ return "finite TTL";
245
+ if (spec.node !== expected.node || spec.vmid !== expected.vmid || spec.vmName !== expected.vmName)
246
+ return "guest identity";
247
+ if (spec.version !== expected.version)
248
+ return "release version";
249
+ if (meta.labels?.["calltelemetry.com/linear-issue"] !== expected.linearIssue)
250
+ return "Linear issue";
251
+ if (typeof meta.uid !== "string" || !UUID_PATTERN.test(meta.uid))
252
+ return "Kubernetes UID";
253
+ return undefined;
254
+ }
255
+ export async function handleClaimedImportOva(rawArgs, context, deps = defaultDeps) {
256
+ const parsed = ClaimedImportOvaInputSchema.safeParse(rawArgs ?? {});
257
+ if (!parsed.success)
258
+ return fail(parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "));
259
+ const value = parsed.data;
260
+ const claimName = value.claimName ?? `claim-${value.linearIssue.toLowerCase()}-${value.vmid ?? ""}`;
261
+ if (value.vmid === undefined || !value.vmPrefix)
262
+ return fail("claimed_import_ova requires vmid and vmPrefix so the claim names the exact guest.");
263
+ const reserved = reservedIdentityError(value.vmid);
264
+ if (reserved)
265
+ return fail(reserved);
266
+ if (value.vmPrefix !== value.assetId)
267
+ return fail("published OVA requires vmPrefix to equal assetId so the claim and guest use one exact name.");
268
+ const requestedNode = normalizeClaimNode(value.node);
269
+ if (!requestedNode || !PROXMOX_CLAIM_NODES.has(requestedNode))
270
+ return fail("node is not a canonical Proxmox claim node.");
271
+ const rawHost = value.hostAssetId.trim().toLowerCase();
272
+ const host = PROXMOX_HOST_INPUTS.includes(rawHost)
273
+ ? normalizeProxmoxHost(rawHost) : null;
274
+ const hostNode = host ? PROXMOX_HOST_CLAIM_NODES[host] : null;
275
+ if (!hostNode || hostNode !== requestedNode)
276
+ return fail("node does not match the canonical hostAssetId; the claim would not protect the guest.");
277
+ if (!hasReleaseReadKey()) {
278
+ return fail(`published OVA import requires all of ${LAB_RELEASES_R2_RO_ENV_NAMES.join(", ")} on the canonical controller; no claim was created.`);
279
+ }
280
+ if (!canonicalOperationAvailable(context, "claimed_import_ova")) {
281
+ return createToolErrorResult("CANONICAL_OPERATION_REQUIRES_BRIDGE", "claimed_import_ova requires the canonical lab bridge; OVA qualification, digest verification, Proxmox import, CPU-before-first-power, and receipts are owned by lab-inventory vm provision --source published-ova. No claim was created. " + IMPORT_BRIDGE_UNAVAILABLE_REMEDY, { operation: "claimed_import_ova" });
282
+ }
283
+ const claimTtlHours = value.claimTtlHours ?? value.ttlHours;
284
+ const claimInput = {
285
+ name: claimName,
286
+ node: requestedNode,
287
+ vmid: value.vmid,
288
+ vmName: value.vmPrefix,
289
+ profile: "bare",
290
+ version: value.version,
291
+ ...((value.action === "import" || value.action === "recover" || value.action === "abandon")
292
+ ? { ttlHours: claimTtlHours } : {}),
293
+ linearIssue: value.linearIssue,
294
+ dryRun: !value.apply,
295
+ };
296
+ const claimParsed = CreateApplianceClaimInputSchema.safeParse(claimInput);
297
+ if (!claimParsed.success)
298
+ return fail(claimParsed.error.issues.map((i) => `claim.${i.path.join(".")}: ${i.message}`).join("; "));
299
+ const built = buildApplianceClaimManifest(claimParsed.data);
300
+ if ("error" in built)
301
+ return fail(built.error);
302
+ const thinRefusal = await guardCanonicalThinStorage(context.canonicalBridge, {
303
+ operation: "claimed_import_ova", hostAssetId: value.hostAssetId, storage: value.storage,
304
+ });
305
+ if (thinRefusal)
306
+ return thinRefusal;
307
+ const namespace = built.manifest.metadata.namespace ?? "ct-lab";
308
+ const expectedClaim = {
309
+ name: built.claimName, namespace, node: requestedNode, vmid: value.vmid,
310
+ vmName: value.vmPrefix, version: value.version,
311
+ ...((value.action === "import" || value.action === "recover" || value.action === "abandon")
312
+ ? { ttlHours: claimTtlHours } : {}),
313
+ linearIssue: value.linearIssue,
314
+ };
315
+ let preplanClaimUid;
316
+ if (value.action !== "import") {
317
+ const existing = await deps.getClaim({ name: built.claimName, namespace }, context);
318
+ if (existing.isError)
319
+ return fail(`the original Ready ApplianceClaim '${built.claimName}' is unavailable; ${value.action} cannot create a replacement claim.`, { detail: textOf(existing) });
320
+ const live = claimOf(existing);
321
+ const mismatch = live ? claimMismatch(live, expectedClaim) : "claim readback";
322
+ if (mismatch || live?.status?.phase !== "Ready")
323
+ return fail(`the original ApplianceClaim is not the exact Ready claim required for ${value.action} (${mismatch ?? "phase"}).`);
324
+ const ready = await deps.awaitReady(built.claimName, namespace, context);
325
+ if (!ready.reconciled)
326
+ return claimNotReconciledResult(ready, {
327
+ operation: "claimed_import_ova", claimName: built.claimName, namespace, timeoutMs: claimReconcileTimeoutMs(),
328
+ });
329
+ const refreshed = await deps.getClaim({ name: built.claimName, namespace }, context);
330
+ const refreshedClaim = refreshed.isError ? null : claimOf(refreshed);
331
+ const refreshedMismatch = refreshedClaim ? claimMismatch(refreshedClaim, expectedClaim) : "claim readback";
332
+ if (refreshedMismatch || refreshedClaim?.status?.phase !== "Ready")
333
+ return fail(`the original ApplianceClaim changed before ${value.action} (${refreshedMismatch ?? "phase"}).`);
334
+ preplanClaimUid = String(refreshedClaim.metadata.uid ?? "");
335
+ if (!UUID_PATTERN.test(preplanClaimUid))
336
+ return fail("the live ApplianceClaim UID is invalid.");
337
+ }
338
+ const planReceipt = value.apply ? `${value.receiptFile}.preflight.json` : value.receiptFile;
339
+ let planArgs;
340
+ try {
341
+ planArgs = buildImportOvaArgs({ ...value, apply: false }, built.claimName, planReceipt, preplanClaimUid);
342
+ }
343
+ catch (error) {
344
+ return fail(error instanceof Error ? error.message : "invalid published OVA plan request");
345
+ }
346
+ const planResult = await deps.importCanonical(planArgs, context, 120_000);
347
+ if (planResult.isError)
348
+ return planResult;
349
+ const plan = parsePlan(planResult);
350
+ const artifact = planArtifact(plan, value.version);
351
+ if (!plan || !artifact)
352
+ return fail("canonical OVA plan did not return the exact published OVA identity; no claim was created.");
353
+ if (plan.eligible !== true) {
354
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, `published OVA plan is not eligible: ${(plan.blocking_reasons ?? []).join(", ") || "canonical plan refused"}; no claim was created`, { operation: "claimed_import_ova", plan });
355
+ }
356
+ if (value.apply && value.confirmOvaSha256 !== artifact.sha256) {
357
+ return fail("confirmOvaSha256 must match the current canonical plan digest; no claim was created.", { expectedOvaSha256: artifact.sha256 });
358
+ }
359
+ if (value.apply && value.action === "finalize") {
360
+ const plannedUuid = plan.recovery?.existing_smbios_uuid;
361
+ if (typeof plannedUuid !== "string" || plannedUuid.toLowerCase() !== value.confirmExistingSmbiosUuid?.toLowerCase()) {
362
+ return fail(`confirmExistingSmbiosUuid must match the current canonical ${value.action} plan; no claim or VM mutation was attempted.`);
363
+ }
364
+ }
365
+ if (value.action === "abandon") {
366
+ const mismatch = abandonPlanMismatch(plan, value, built.claimName, preplanClaimUid ?? "", artifact);
367
+ if (mismatch)
368
+ return fail(`${mismatch}; the Ready claim was retained and no source cleanup or claim deletion was attempted.`);
369
+ }
370
+ if (value.apply && value.action === "recover"
371
+ && (plan.recovery?.existing_vm === true || typeof plan.recovery?.existing_smbios_uuid === "string")) {
372
+ return fail("same-operation OVA recovery is allowed only before the target guest exists; use exact finalize or abandon for a retained guest.");
373
+ }
374
+ if (!value.apply) {
375
+ return {
376
+ content: [{ type: "text", text: JSON.stringify({
377
+ success: true, mode: value.action, claim: { name: built.claimName, namespace: built.manifest.metadata.namespace, manifest: built.manifest },
378
+ publishedOva: artifact, cpuProfile: { profile: "portable-v2", model: "Nehalem" },
379
+ canonicalPlan: plan,
380
+ next: value.action === "import"
381
+ ? "Apply with the exact OVA SHA-256 confirmation. The bare finite claim is created and observed Ready before the canonical import; any uncertain outcome retains it."
382
+ : value.action === "recover"
383
+ ? "Apply with the same operation id and exact Ready claim. Recovery is limited to an absent guest and absent Proxmox import volume; use finalize or abandon after guest creation."
384
+ : value.action === "finalize"
385
+ ? "After vm_repair, apply this exact source request with the reviewed guest UUID and the same Ready claim UID."
386
+ : "Apply only after the exact VM and OVA import volume are approved for cleanup; the canonical source verifies absence before this tool removes the claim.",
387
+ }, null, 2) }],
388
+ structuredContent: { success: true, mode: value.action, claimName: built.claimName, publishedOva: artifact, plan },
389
+ };
390
+ }
391
+ let claimCreatedThisCall = false;
392
+ let existing = await deps.getClaim({ name: built.claimName, namespace }, context);
393
+ if (existing.isError) {
394
+ if (!existingClaimError(existing, built.claimName, namespace)) {
395
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `could not read the exact ApplianceClaim before OVA ${value.action}: ${textOf(existing)}; no canonical action was attempted`, { operation: "claimed_import_ova", claimName: built.claimName, guestCreated: false });
396
+ }
397
+ if (value.action !== "import") {
398
+ return fail(`the original Ready ApplianceClaim '${built.claimName}' is absent; ${value.action} cannot create a replacement claim.`);
399
+ }
400
+ const created = await deps.createClaim({ ...claimInput, dryRun: false });
401
+ if (created.isError) {
402
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `claim creation failed; the OVA was NOT imported: ${textOf(created)}`, { operation: "claimed_import_ova", claimName: built.claimName });
403
+ }
404
+ claimCreatedThisCall = true;
405
+ }
406
+ else {
407
+ const claim = claimOf(existing);
408
+ const mismatch = claim ? claimMismatch(claim, expectedClaim) : "claim readback";
409
+ if (mismatch)
410
+ return fail(`existing ApplianceClaim does not match the exact OVA import (${mismatch}); no import was attempted.`, { claimName: built.claimName });
411
+ }
412
+ const reconciled = await deps.awaitReady(built.claimName, namespace, context);
413
+ if (!reconciled.reconciled) {
414
+ return claimNotReconciledResult(reconciled, {
415
+ operation: "claimed_import_ova", claimName: built.claimName, namespace, timeoutMs: claimReconcileTimeoutMs(),
416
+ });
417
+ }
418
+ const readyResult = await deps.getClaim({ name: built.claimName, namespace }, context);
419
+ const readyClaim = readyResult.isError ? null : claimOf(readyResult);
420
+ const mismatch = readyClaim ? claimMismatch(readyClaim, expectedClaim) : "Ready claim readback";
421
+ if (mismatch || readyClaim?.status?.phase !== "Ready") {
422
+ return createToolErrorResult("CLAIM_NOT_RECONCILED", `ApplianceClaim '${built.claimName}' did not retain its exact Ready identity (${mismatch ?? "phase"}); the OVA was NOT imported and the claim was retained.`, { operation: "claimed_import_ova", claimName: built.claimName, namespace, guestCreated: false, claimProtection: { disposition: "retained", guestAbsentVerified: true } });
423
+ }
424
+ const claimUid = String(readyClaim.metadata.uid ?? "");
425
+ if (!UUID_PATTERN.test(claimUid) || (preplanClaimUid && claimUid !== preplanClaimUid)) {
426
+ return fail("the ApplianceClaim UID changed between the OVA plan and apply; no canonical action was attempted.", { claimName: built.claimName });
427
+ }
428
+ const applyArgs = { ...value, claimName: built.claimName, apply: true };
429
+ let command;
430
+ try {
431
+ command = buildImportOvaArgs(applyArgs, built.claimName, value.receiptFile, claimUid, artifact.sha256);
432
+ }
433
+ catch (error) {
434
+ return fail(error instanceof Error ? error.message : "invalid published OVA apply request", { claimName: built.claimName, claimUid });
435
+ }
436
+ let imported;
437
+ try {
438
+ imported = await deps.importCanonical(command, context, 3_600_000);
439
+ }
440
+ catch (error) {
441
+ imported = createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `canonical OVA ${value.action} threw: ${error instanceof Error ? error.message : String(error)}`);
442
+ }
443
+ if (imported.isError) {
444
+ const claimProtection = {
445
+ schema: "calltelemetry-lab-claim-protection/v1",
446
+ operation: "claimed_import_ova", operationId: value.operationId,
447
+ action: value.action,
448
+ claimName: built.claimName, namespace, claimUid, node: requestedNode,
449
+ vmid: value.vmid, vmName: value.vmPrefix, linearIssue: value.linearIssue,
450
+ ttlHours: readyClaim.spec.ttlHours, claimCreatedThisCall,
451
+ disposition: "retained", guestAbsentVerified: false,
452
+ next: "Read the exact live ApplianceClaim and canonical pending operation. Reconcile or use the governed exact-identity cleanup; do not delete the claim to clear an import error.",
453
+ };
454
+ return { ...imported,
455
+ content: [...(imported.content ?? []), { type: "text", text: JSON.stringify({ claimProtection }) }],
456
+ structuredContent: { ...(imported.structuredContent ?? {}), claimProtection },
457
+ };
458
+ }
459
+ if (value.action === "abandon") {
460
+ const abandonReceipt = parsePlan(imported);
461
+ const cleanup = abandonReceipt?.cleanup;
462
+ if (abandonReceipt?.status !== "abandoned" || cleanup?.verification?.vm_absent !== true
463
+ || cleanup?.verification?.import_volume_absent !== true) {
464
+ const claimProtection = { disposition: "retained", guestAbsentVerified: false };
465
+ const refusal = createToolErrorResult("CLEANUP_PROOF_MISSING", "canonical OVA abandon returned no exact VM and import-volume absence proof; the ApplianceClaim was retained", { operation: "claimed_import_ova", claimName: built.claimName, claimUid, sourceReceipt: imported.structuredContent,
466
+ claimProtection });
467
+ return { ...refusal,
468
+ content: [...(refusal.content ?? []), { type: "text", text: JSON.stringify({ claimProtection }) }],
469
+ structuredContent: { ...(refusal.structuredContent ?? {}), claimProtection },
470
+ };
471
+ }
472
+ const deleted = await deps.deleteClaim({ name: built.claimName, namespace, expectedUid: claimUid }, context);
473
+ if (deleted.isError) {
474
+ return { ...deleted,
475
+ content: [...(deleted.content ?? []), { type: "text", text: JSON.stringify({
476
+ sourceCleanup: cleanup, claimProtection: { name: built.claimName, namespace, uid: claimUid,
477
+ disposition: "retained", guestAbsentVerified: true },
478
+ }) }],
479
+ structuredContent: { ...(deleted.structuredContent ?? {}), sourceCleanup: cleanup,
480
+ claimProtection: { name: built.claimName, namespace, uid: claimUid, disposition: "retained", guestAbsentVerified: true } },
481
+ };
482
+ }
483
+ const absent = await deps.getClaim({ name: built.claimName, namespace }, context);
484
+ if (!existingClaimError(absent, built.claimName, namespace)) {
485
+ return createToolErrorResult("CLAIM_DELETE_PENDING", "the Proxmox VM and import volume are absent, but the exact ApplianceClaim deletion is not yet confirmed; no terminal cleanup pass is reported", { operation: "claimed_import_ova", claimName: built.claimName, namespace, claimUid,
486
+ sourceCleanup: cleanup, claimDeletion: deleted.structuredContent ?? textOf(deleted) });
487
+ }
488
+ return { content: [{ type: "text", text: JSON.stringify({
489
+ success: true, mode: "abandon", claim: { name: built.claimName, namespace, uid: claimUid, absent: true },
490
+ sourceCleanup: cleanup, claimDeletion: deleted.structuredContent ?? textOf(deleted),
491
+ }, null, 2) }], structuredContent: { success: true, mode: "abandon", claimUid, sourceCleanup: cleanup } };
492
+ }
493
+ return {
494
+ content: [{ type: "text", text: JSON.stringify({
495
+ success: true, mode: value.action,
496
+ claim: { name: built.claimName, namespace, uid: claimUid, phase: "Ready", profile: "bare",
497
+ node: requestedNode, vmid: value.vmid, vmName: value.vmPrefix, ttlHours: readyClaim.spec.ttlHours, reused: !claimCreatedThisCall },
498
+ publishedOva: artifact,
499
+ import: textOf(imported),
500
+ lifecycle: "The exact Ready finite claim protects the imported OVA. Complete credential enrollment and installed-state readback before air-gap suites; retain the claim on every partial outcome.",
501
+ }, null, 2) }],
502
+ structuredContent: { success: true, mode: value.action, claimName: built.claimName, claimUid, publishedOva: artifact, import: imported.structuredContent },
503
+ };
504
+ }
505
+ export const CLAIMED_IMPORT_OVA_TOOL_DESCRIPTION = "Plan or import an exact published VMware OVA as a claimed disposable Proxmox guest through canonical lab-inventory vm provision --source published-ova. The canonical Linux lab-LAN controller resolves the OVA by exact version, verifies original size/SHA-256, rejects ambiguous OVF/VMDK structure, hashes the single embedded VMDK, cross-checks Proxmox import metadata, applies portable-v2=Nehalem while stopped, and records separate target-volume size and conversion provenance. The existing QCOW schema stays unchanged; this tool never accepts an OVA URL, QCOW URL, or caller-supplied disk digest. Import creates or reuses only the exact finite bare ApplianceClaim, waits for Ready, and forwards its live UID. After a pre-guest fetch failure, action=recover retries only the same operation after live claim checks; it refuses any existing guest. After vm_repair, use action=finalize from a valid imported checkpoint and live readbacks. Use action=abandon to clean the exact VM and import volume through the canonical source path, then request claim deletion only after the absence receipt. Every uncertain operation retains the claim for reconciliation.";
506
+ //# sourceMappingURL=claimed-import-ova.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimed-import-ova.js","sourceRoot":"","sources":["../../../src/tools/claimed-import-ova.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAIL,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAgUzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAYjC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAshCjF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAIL,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAsUzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAYjC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAkiCjF"}
@@ -67,6 +67,7 @@ import { claimFirstCanonicalApply, hostForClaimNode } from "./claim-first.js";
67
67
  import { CLAIMED_SNAPSHOT_HINT } from "./claimed-snapshot.js";
68
68
  import { isClaimedSnapshotToolCall, legacyGuestHandlerBlocked, legacyRefusalDetail, LEGACY_GUEST_AUTHORITY_ERROR, SNAPSHOT_TOOLS } from "./legacy-guest-guard.js";
69
69
  import { ClaimedImportQcowInputObjectSchema, CLAIMED_IMPORT_QCOW_TOOL_DESCRIPTION, handleClaimedImportQcow, } from "./claimed-import-qcow.js";
70
+ import { ClaimedImportOvaInputObjectSchema, CLAIMED_IMPORT_OVA_TOOL_DESCRIPTION, handleClaimedImportOva, } from "./claimed-import-ova.js";
70
71
  import { SideloadApplianceRunnerInputShape, handleSideloadApplianceRunner, } from "./sideload-runner.js";
71
72
  import { GetApplianceIdInputShape, handleGetApplianceId, } from "./appliance-id.js";
72
73
  import { VerifyApplianceDemoInputShape, handleVerifyApplianceDemo, } from "./verify-demo.js";
@@ -372,6 +373,10 @@ export function registerAllTools(mcpServer, context) {
372
373
  description: CLAIMED_IMPORT_QCOW_TOOL_DESCRIPTION,
373
374
  inputSchema: ClaimedImportQcowInputObjectSchema,
374
375
  }, guardToolHandler("claimed_import_qcow", async (args) => handleClaimedImportQcow(args, context)));
376
+ mcpServer.registerTool("claimed_import_ova", {
377
+ description: CLAIMED_IMPORT_OVA_TOOL_DESCRIPTION,
378
+ inputSchema: ClaimedImportOvaInputObjectSchema,
379
+ }, guardToolHandler("claimed_import_ova", async (args) => handleClaimedImportOva(args, context)));
375
380
  server.tool("pin_pool_slots", "RETIRED (slot retirement ADR (REL-1746)): returns an explicit retired error and takes no action. There are no pool slots; pass webImage to proxmox_quick_provision to pin the web image at provision time.", PinPoolSlotsInputShape, async () => retiredSlotVerbResult("pin_pool_slots"));
376
381
  // 7. auto_provision_vm
377
382
  server.tool("auto_provision_vm", "Auto-select the live resource-qualified Proxmox host with the most free RAM (then disk headroom), claim it, clone/boot the appliance, pin the requested release, and return verified endpoints. A test-only placementSeed makes selection reproducible. Hold until the live claim expires; cleanup returns capacity only after verified destruction. Guest disks are thin-only: storage must be lvmthin (e.g. local-lvm); thick or undeterminable storage is refused with THICK_STORAGE_REFUSED before any change.", AutoProvisionVmInputShape, async (args) => {