/** * DNS provider interface. * * Vibn supports multiple authoritative DNS backends so a workspace can opt * into stricter residency (CIRA D-Zone) without changing the REST/MCP * surface. All providers implement the same contract. * * Default provider today: cloud-dns (Google Cloud DNS). Global anycast, * configuration replicated inside Google's infrastructure. Acceptable for * public records; not Canadian-pinned at the config layer. * * Future provider: cira-dzone (CIRA D-Zone, Canadian-operated). Activated * per-workspace via `dns_provider = 'cira_dzone'`. */ export interface DnsRecord { /** Relative name (e.g. "@", "www", "app"). */ name: string; type: 'A' | 'AAAA' | 'CNAME' | 'TXT' | 'MX' | 'NS' | 'CAA'; /** RRDATA lines — e.g. ["1.2.3.4"] or ["10 mail.example.com."]. */ rrdatas: string[]; ttl?: number; } export interface DnsZone { apex: string; // "example.com" zoneId: string; // provider-side zone identifier nameservers: string[]; // delegation set the registrant should set at the registrar createdAt?: string; } export interface DnsProvider { readonly id: 'cloud_dns' | 'cira_dzone'; createZone(apex: string): Promise; getZone(apex: string): Promise; setRecords(apex: string, records: DnsRecord[]): Promise; deleteZone(apex: string): Promise; } export class DnsNotConfiguredError extends Error { constructor(providerId: string) { super( `DNS provider "${providerId}" is not configured. ` + `Check that the service account has required permissions and env vars are set.`, ); this.name = 'DnsNotConfiguredError'; } }