/*
RFC-0558: identity.credential.revoke — add a credential id to the
revocation list in werkstatt.identity.json.
- Do not delete the credential — revocation is a status change, not removal.
- Do not verify credentials — that is identity.credential.verify.
- RFC-0558: initial identity.credential.revoke command handler.
- RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt
*/
import type {
KernelCommandInput,
KernelCommandResult,
KernelRuntimeContext,
} from "@warpgogol/werkstatt-engine/kernel";
import {
readIdentityConfig,
writeIdentityConfig,
findCredential,
isRevoked,
} from "./identity-io.ts";
import { failResult } from "@warpgogol/werkstatt-shared/checks/result-helpers";
export interface IdentityCredentialRevokeData {
credentialId: string;
revoked: boolean;
}
function flagString(input: KernelCommandInput, key: string): string | undefined {
const v = input.flags[key];
return typeof v === "string" ? v : undefined;
}
export async function runIdentityCredentialRevoke(
input: KernelCommandInput,
context: KernelRuntimeContext,
): Promise> {
const { workspaceRoot } = context;
const credentialId = flagString(input, "credential-id");
if (!credentialId) throw new Error("[identity.credential.revoke] --credential-id is required");
const config = await readIdentityConfig(workspaceRoot);
const credential = findCredential(config, credentialId);
if (!credential) {
return {
...failResult("identity.credential.revoke", [`credential '${credentialId}' not found`]),
data: { credentialId, revoked: false },
};
}
if (isRevoked(config, credentialId)) {
return {
data: { credentialId, revoked: true },
exitCode: 0,
summary: `[identity.credential.revoke] credential '${credentialId}' already revoked`,
};
}
config.revokedCredentialIds.push(credentialId);
await writeIdentityConfig(workspaceRoot, config);
return {
data: { credentialId, revoked: true },
exitCode: 0,
summary: `[identity.credential.revoke] credential '${credentialId}' revoked`,
};
}