/* RFC-0967: Command handlers for fleet.ownership.register, verify, transfer. Thin wrappers around ownership-registry.ts client logic. Does not implement registry logic — that lives in ownership-registry.ts. RFC-0967: initial command handlers for fleet.ownership.register/verify/transfer. RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt */ import type { KernelCommandInput, KernelCommandResult, KernelRuntimeContext, } from "@warpgogol/werkstatt-shared/kernel"; import { registerOwnership, verifyOwnership, transferOwnership, OwnershipError, } from "./ownership-registry.ts"; import { failResult } from "@warpgogol/werkstatt-shared/checks/result-helpers"; function flagString(input: KernelCommandInput, key: string): string | undefined { const v = input.flags[key]; return typeof v === "string" ? v : undefined; } export async function runFleetOwnershipRegister( input: KernelCommandInput, context: KernelRuntimeContext, ): Promise { const systemId = flagString(input, "id"); if (!systemId) { return { ...failResult("fleet.ownership.register", ["--id flag is required"]), data: { error: "missing --id flag" }, }; } try { const result = await registerOwnership({ systemId, werkstattRoot: context.workspaceRoot, }); if (!result.registered && result.conflict) { return { ...failResult("ownership.commands", [ `[fleet.ownership.register] ${systemId} conflict: already claimed by ${result.conflict.existingClaim?.instanceId ?? "unknown"}`, ]), data: { command: "fleet.ownership.register", systemId, ...result, }, }; } return { exitCode: 0, summary: `[fleet.ownership.register] ${systemId} registered (hash: ${result.claim.passportHash})`, data: { command: "fleet.ownership.register", systemId, ...result, }, }; } catch (err) { if (err instanceof OwnershipError) { return { ...failResult("ownership.commands", [ `[fleet.ownership.register] ${err.code}: ${err.message}`, ]), data: { command: "fleet.ownership.register", systemId, error: err.code, message: err.message, }, }; } return { ...failResult("ownership.commands", [ `[fleet.ownership.register] error: ${err instanceof Error ? err.message : String(err)}`, ]), data: { command: "fleet.ownership.register", systemId, error: String(err) }, }; } } export async function runFleetOwnershipVerify( input: KernelCommandInput, context: KernelRuntimeContext, ): Promise { const systemId = flagString(input, "id"); if (!systemId) { return { ...failResult("fleet.ownership.verify", ["--id flag is required"]), data: { error: "missing --id flag" }, }; } try { const result = await verifyOwnership({ systemId, werkstattRoot: context.workspaceRoot, }); if (!result.registered) { return { exitCode: 0, summary: `[fleet.ownership.verify] ${systemId} not registered`, data: { command: "fleet.ownership.verify", systemId, ...result, }, }; } return { exitCode: 0, summary: `[fleet.ownership.verify] ${systemId} registered to ${result.claim?.creatorIdentity} on ${result.claim?.instanceId}`, data: { command: "fleet.ownership.verify", systemId, ...result, }, }; } catch (err) { if (err instanceof OwnershipError) { return { ...failResult("ownership.commands", [ `[fleet.ownership.verify] ${err.code}: ${err.message}`, ]), data: { command: "fleet.ownership.verify", systemId, error: err.code, message: err.message, }, }; } return { ...failResult("ownership.commands", [ `[fleet.ownership.verify] error: ${err instanceof Error ? err.message : String(err)}`, ]), data: { command: "fleet.ownership.verify", systemId, error: String(err) }, }; } } export async function runFleetOwnershipTransfer( input: KernelCommandInput, context: KernelRuntimeContext, ): Promise { const systemId = flagString(input, "id"); const authorization = flagString(input, "authorization"); if (!systemId) { return { ...failResult("fleet.ownership.transfer", ["--id flag is required"]), data: { error: "missing --id flag" }, }; } if (!authorization) { return { ...failResult("fleet.ownership.transfer", ["--authorization flag is required"]), data: { error: "missing --authorization flag" }, }; } try { const result = await transferOwnership({ systemId, werkstattRoot: context.workspaceRoot, authorizationPath: authorization, io: context.io, }); return { exitCode: 0, summary: `[fleet.ownership.transfer] ${systemId} transferred from ${result.previousClaim.instanceId} to ${result.newClaim.instanceId}`, data: { command: "fleet.ownership.transfer", systemId, ...result, }, }; } catch (err) { if (err instanceof OwnershipError) { return { ...failResult("ownership.commands", [ `[fleet.ownership.transfer] ${err.code}: ${err.message}`, ]), data: { command: "fleet.ownership.transfer", systemId, error: err.code, message: err.message, }, }; } return { ...failResult("ownership.commands", [ `[fleet.ownership.transfer] error: ${err instanceof Error ? err.message : String(err)}`, ]), data: { command: "fleet.ownership.transfer", systemId, error: String(err) }, }; } }