/* RFC-0558: shared I/O helpers for identity config (werkstatt.identity.json) read/write and credential ID generation. Do not handle signing — that lives in @warpgogol/werkstatt-shared/passport/identity-sign. Do not handle key generation — that lives in @warpgogol/werkstatt-shared/passport/sign. RFC-0558: initial identity I/O helpers. */ import { join } from "node:path"; import { randomUUID } from "node:crypto"; import { WerkstattIdentityConfigSchema, type WerkstattIdentityConfig, type WerkstattCredential, } from "@warpgogol/werkstatt-shared/passport"; import { createDefaultIO, type WorkspaceIO } from "@warpgogol/werkstatt-shared/kernel/workspace-io"; export const IDENTITY_CONFIG_FILENAME = "werkstatt.identity.json"; export function identityConfigPath(workspaceRoot: string): string { return join(workspaceRoot, IDENTITY_CONFIG_FILENAME); } export async function readIdentityConfig( workspaceRoot: string, io: WorkspaceIO = createDefaultIO().io, ): Promise { const raw = await io.readFile(identityConfigPath(workspaceRoot)); const parsed = JSON.parse(raw); return WerkstattIdentityConfigSchema.parse(parsed); } export async function writeIdentityConfig( workspaceRoot: string, config: WerkstattIdentityConfig, io: WorkspaceIO = createDefaultIO().io, ): Promise { const path = identityConfigPath(workspaceRoot); await io.writeFile(path, JSON.stringify(config, null, 2) + "\n"); } export function generateCredentialId(): string { return `urn:warpgogol:cred:${randomUUID()}`; } export function findCredential( config: WerkstattIdentityConfig, credentialId: string, ): WerkstattCredential | undefined { return config.issuedCredentials.find((c) => c.credentialId === credentialId); } export function isRevoked(config: WerkstattIdentityConfig, credentialId: string): boolean { return config.revokedCredentialIds.includes(credentialId); }