@hasna/domains 0.0.13 → 0.0.15

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.
Files changed (36) hide show
  1. package/dist/cli/commands/doctor.d.ts.map +1 -1
  2. package/dist/cli/commands/domain.d.ts.map +1 -1
  3. package/dist/cli/commands/provision.d.ts +3 -0
  4. package/dist/cli/commands/provision.d.ts.map +1 -0
  5. package/dist/cli/index.js +10315 -7703
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +127 -8
  9. package/dist/lib/brandsight.d.ts +20 -0
  10. package/dist/lib/brandsight.d.ts.map +1 -1
  11. package/dist/lib/capability.d.ts +30 -0
  12. package/dist/lib/capability.d.ts.map +1 -0
  13. package/dist/lib/cloudflare-auth.d.ts +15 -0
  14. package/dist/lib/cloudflare-auth.d.ts.map +1 -0
  15. package/dist/lib/cloudflare.d.ts +13 -4
  16. package/dist/lib/cloudflare.d.ts.map +1 -1
  17. package/dist/lib/config.d.ts +10 -0
  18. package/dist/lib/config.d.ts.map +1 -1
  19. package/dist/lib/creds-check.d.ts +13 -0
  20. package/dist/lib/creds-check.d.ts.map +1 -0
  21. package/dist/lib/domain-daemon-deps.d.ts +8 -0
  22. package/dist/lib/domain-daemon-deps.d.ts.map +1 -0
  23. package/dist/lib/domain-daemon.d.ts +30 -0
  24. package/dist/lib/domain-daemon.d.ts.map +1 -0
  25. package/dist/lib/godaddy.d.ts +12 -0
  26. package/dist/lib/godaddy.d.ts.map +1 -1
  27. package/dist/lib/ns-drift.d.ts +29 -0
  28. package/dist/lib/ns-drift.d.ts.map +1 -0
  29. package/dist/lib/provision-state.d.ts +29 -0
  30. package/dist/lib/provision-state.d.ts.map +1 -0
  31. package/dist/lib/registration-poll.d.ts +24 -0
  32. package/dist/lib/registration-poll.d.ts.map +1 -0
  33. package/dist/mcp/http.d.ts +2 -1
  34. package/dist/mcp/http.d.ts.map +1 -1
  35. package/dist/mcp/index.js +43 -17
  36. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -8,4 +8,9 @@ export { whoisLookup, checkDnsPropagation, checkSsl, exportZoneFile, importZoneF
8
8
  export { getDatabase, closeDatabase } from "./db/database.js";
9
9
  export { getProvider, getAvailableProviders, syncAll, autoDetectRegistrar, type RegistrarProvider, type ProviderDnsRecord, type ProviderDomainInfo, type ProviderAvailability, type ProviderInfo, type SyncAllResult, } from "./lib/registrar.js";
10
10
  export { checkAvailability as r53CheckAvailability, registerDomain as r53RegisterDomain, getRegistrationStatus as r53GetRegistrationStatus, updateNameservers as r53UpdateNameservers, listRegisteredDomains as r53ListRegisteredDomains, createHostedZone as r53CreateHostedZone, listHostedZones as r53ListHostedZones, getHostedZone as r53GetHostedZone, deleteHostedZone as r53DeleteHostedZone, findHostedZoneByDomain as r53FindHostedZoneByDomain, listRecords as r53ListRecords, upsertRecord as r53UpsertRecord, upsertRecords as r53UpsertRecords, deleteRecord as r53DeleteRecord, createRoute53Provider, getConfig as r53GetConfig, type Route53Config, type DomainContactInfo, type DomainAvailability, type RegisteredDomain, type HostedZoneInfo, type Route53Record, type Route53RecordInput, } from "./lib/route53.js";
11
+ export { createZone as cfCreateZone, getZone as cfGetZone, ensureZone as cfEnsureZone, upsertRecord as cfUpsertRecord, type CloudflareZone, } from "./lib/cloudflare.js";
12
+ export { resolveCloudflareConfig, cloudflareAuthHeaders, type CloudflareConfig } from "./lib/cloudflare-auth.js";
13
+ export { delegateDomainToCloudflare, type DelegateResult } from "./lib/delegate.js";
14
+ export { PROVIDER_CAPABILITIES, getCapability, canBuy, selectBuyRegistrar, selectDnsProvider, type ProviderCapability, } from "./lib/capability.js";
15
+ export { classifyRegistrationStatus, pollRegistrationUntilDone, type RegVerdict, type PollResult as RegistrationPollResult, } from "./lib/registration-poll.js";
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,KAAK,KAAK,EACV,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,iBAAiB,IAAI,oBAAoB,EACzC,cAAc,IAAI,iBAAiB,EACnC,qBAAqB,IAAI,wBAAwB,EACjD,iBAAiB,IAAI,oBAAoB,EACzC,qBAAqB,IAAI,wBAAwB,EACjD,gBAAgB,IAAI,mBAAmB,EACvC,eAAe,IAAI,kBAAkB,EACrC,aAAa,IAAI,gBAAgB,EACjC,gBAAgB,IAAI,mBAAmB,EACvC,sBAAsB,IAAI,yBAAyB,EACnD,WAAW,IAAI,cAAc,EAC7B,YAAY,IAAI,eAAe,EAC/B,aAAa,IAAI,gBAAgB,EACjC,YAAY,IAAI,eAAe,EAC/B,qBAAqB,EACrB,SAAS,IAAI,YAAY,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -30733,17 +30733,38 @@ function createRoute53Provider(config) {
30733
30733
  };
30734
30734
  }
30735
30735
 
30736
+ // src/lib/cloudflare-auth.ts
30737
+ function resolveCloudflareConfig(env = process.env) {
30738
+ const accountId = env["CLOUDFLARE_ACCOUNT_ID"] || env["HASNAXYZ_CLOUDFLARE_LIVE_ACCOUNT_ID"] || undefined;
30739
+ if (env["CLOUDFLARE_API_TOKEN"]) {
30740
+ return { apiToken: env["CLOUDFLARE_API_TOKEN"], accountId };
30741
+ }
30742
+ if (env["CLOUDFLARE_API_KEY"] && env["CLOUDFLARE_EMAIL"]) {
30743
+ return { apiKey: env["CLOUDFLARE_API_KEY"], email: env["CLOUDFLARE_EMAIL"], accountId };
30744
+ }
30745
+ if (env["HASNAXYZ_CLOUDFLARE_LIVE_API_KEY"] && env["HASNAXYZ_CLOUDFLARE_LIVE_EMAIL"]) {
30746
+ return {
30747
+ apiKey: env["HASNAXYZ_CLOUDFLARE_LIVE_API_KEY"],
30748
+ email: env["HASNAXYZ_CLOUDFLARE_LIVE_EMAIL"],
30749
+ accountId
30750
+ };
30751
+ }
30752
+ return accountId ? { accountId } : {};
30753
+ }
30754
+ function cloudflareAuthHeaders(cfg) {
30755
+ if (cfg.apiToken)
30756
+ return { Authorization: `Bearer ${cfg.apiToken}` };
30757
+ if (cfg.apiKey && cfg.email)
30758
+ return { "X-Auth-Key": cfg.apiKey, "X-Auth-Email": cfg.email };
30759
+ throw new Error("Cloudflare credentials not configured. Set CLOUDFLARE_API_TOKEN, or CLOUDFLARE_API_KEY + CLOUDFLARE_EMAIL.");
30760
+ }
30761
+
30736
30762
  // src/lib/cloudflare.ts
30737
30763
  function getConfig3() {
30738
- return {
30739
- apiToken: process.env["CLOUDFLARE_API_TOKEN"],
30740
- accountId: process.env["CLOUDFLARE_ACCOUNT_ID"]
30741
- };
30764
+ return resolveCloudflareConfig();
30742
30765
  }
30743
30766
  function checkCredentials2(cfg) {
30744
- if (!cfg.apiToken) {
30745
- throw new Error("Cloudflare credentials not configured. Set CLOUDFLARE_API_TOKEN environment variable.");
30746
- }
30767
+ cloudflareAuthHeaders(cfg);
30747
30768
  }
30748
30769
  var CF_BASE = "https://api.cloudflare.com/client/v4";
30749
30770
  async function cfFetch(path, opts = {}) {
@@ -30752,7 +30773,7 @@ async function cfFetch(path, opts = {}) {
30752
30773
  const res = await fetch(`${CF_BASE}${path}`, {
30753
30774
  method: opts.method ?? "GET",
30754
30775
  headers: {
30755
- Authorization: `Bearer ${cfg.apiToken}`,
30776
+ ...cloudflareAuthHeaders(cfg),
30756
30777
  "Content-Type": "application/json"
30757
30778
  },
30758
30779
  body: opts.body ? JSON.stringify(opts.body) : undefined
@@ -30771,6 +30792,24 @@ async function getZone(domain, config) {
30771
30792
  const z2 = result[0];
30772
30793
  return { id: z2.id, name: z2.name, status: z2.status, nameservers: z2.name_servers, original_nameservers: z2.original_name_servers };
30773
30794
  }
30795
+ async function createZone(domain, config) {
30796
+ const cfg = config ?? getConfig3();
30797
+ if (!cfg.accountId) {
30798
+ throw new Error("CLOUDFLARE_ACCOUNT_ID is required to create a zone.");
30799
+ }
30800
+ const result = await cfFetch("/zones", { method: "POST", body: { name: domain, account: { id: cfg.accountId }, jump_start: false }, config: cfg });
30801
+ return { id: result.id, name: result.name, status: result.status, nameservers: result.name_servers };
30802
+ }
30803
+ async function ensureZone(domain, config, deps) {
30804
+ const get = deps?.getZone ?? getZone;
30805
+ const create = deps?.createZone ?? createZone;
30806
+ const existing = await get(domain, config);
30807
+ const zone = existing ?? await create(domain, config);
30808
+ if (!zone.nameservers || zone.nameservers.length === 0) {
30809
+ throw new Error(`Cloudflare zone for ${domain} has no nameservers yet`);
30810
+ }
30811
+ return zone;
30812
+ }
30774
30813
  async function listRecords2(zoneId, config) {
30775
30814
  const records = [];
30776
30815
  let page = 1;
@@ -31280,6 +31319,72 @@ function autoDetectRegistrar(domain, getDomainByName2) {
31280
31319
  return "brandsight";
31281
31320
  return null;
31282
31321
  }
31322
+ // src/lib/delegate.ts
31323
+ async function delegateDomainToCloudflare(domain, deps) {
31324
+ const zone = await deps.createCloudflareZone(domain);
31325
+ if (!zone.nameservers || zone.nameservers.length === 0) {
31326
+ throw new Error(`Cloudflare zone for ${domain} returned no nameservers; cannot delegate`);
31327
+ }
31328
+ const { operationId } = await deps.updateNameservers(domain, zone.nameservers);
31329
+ return { zoneId: zone.id, nameservers: zone.nameservers, operationId };
31330
+ }
31331
+ // src/lib/capability.ts
31332
+ var PROVIDER_CAPABILITIES = {
31333
+ route53: { canBuy: true, canDns: true, gated: false, notes: "Full self-serve buy + hosted zones via AWS API; primary buy path." },
31334
+ cloudflare: { canBuy: false, canDns: true, gated: false, notes: "DNS/zone management only; not a registrar. Always our DNS." },
31335
+ namecheap: { canBuy: true, canDns: true, gated: false, notes: "Buy + DNS via API; requires API access + whitelisted IP." },
31336
+ godaddy: { canBuy: true, canDns: true, gated: true, notes: "Domains API gated behind account thresholds (>=10 / Discount Domain Club) since 2024; purchase + DNS writes unreliable." },
31337
+ brandsight: { canBuy: true, canDns: true, gated: true, notes: "GoDaddy Corporate Domains (enterprise/contract-only); credentials issued to onboarded clients, not self-serve." }
31338
+ };
31339
+ var UNKNOWN = { canBuy: false, canDns: false, gated: true, notes: "Unknown provider." };
31340
+ function getCapability(name) {
31341
+ return PROVIDER_CAPABILITIES[name.toLowerCase()] ?? UNKNOWN;
31342
+ }
31343
+ function canBuy(name) {
31344
+ const c3 = getCapability(name);
31345
+ return c3.canBuy && !c3.gated;
31346
+ }
31347
+ function selectBuyRegistrar(preference) {
31348
+ if (preference) {
31349
+ const c3 = getCapability(preference);
31350
+ if (!c3.canBuy)
31351
+ throw new Error(`Registrar '${preference}' cannot buy domains`);
31352
+ if (c3.gated)
31353
+ throw new Error(`Registrar '${preference}' is gated/enterprise-only and not available for automated purchase: ${c3.notes}`);
31354
+ return preference.toLowerCase();
31355
+ }
31356
+ return "route53";
31357
+ }
31358
+ function selectDnsProvider() {
31359
+ return "cloudflare";
31360
+ }
31361
+ // src/lib/registration-poll.ts
31362
+ function classifyRegistrationStatus(status) {
31363
+ const s3 = status.toUpperCase();
31364
+ if (s3 === "SUCCESSFUL")
31365
+ return "success";
31366
+ if (s3 === "ERROR" || s3 === "FAILED")
31367
+ return "failed";
31368
+ return "pending";
31369
+ }
31370
+ async function pollRegistrationUntilDone(operationId, opts) {
31371
+ const maxAttempts = opts.maxAttempts ?? 60;
31372
+ const intervalMs = opts.intervalMs ?? 1e4;
31373
+ const sleep = opts.sleep ?? ((ms) => new Promise((r3) => setTimeout(r3, ms)));
31374
+ let attempts = 0;
31375
+ while (attempts < maxAttempts) {
31376
+ const { status, message } = await opts.getStatus(operationId);
31377
+ attempts++;
31378
+ const verdict = classifyRegistrationStatus(status);
31379
+ if (verdict === "success")
31380
+ return { status: "success", attempts, message };
31381
+ if (verdict === "failed")
31382
+ return { status: "failed", attempts, message };
31383
+ if (attempts < maxAttempts)
31384
+ await sleep(intervalMs);
31385
+ }
31386
+ return { status: "timeout", attempts };
31387
+ }
31283
31388
  export {
31284
31389
  whoisLookup,
31285
31390
  validateDns,
@@ -31287,7 +31392,10 @@ export {
31287
31392
  updateDomain,
31288
31393
  updateDnsRecord,
31289
31394
  syncAll,
31395
+ selectDnsProvider,
31396
+ selectBuyRegistrar,
31290
31397
  searchDomains,
31398
+ resolveCloudflareConfig,
31291
31399
  recordDomainPurchase,
31292
31400
  upsertRecords as r53UpsertRecords,
31293
31401
  upsertRecord as r53UpsertRecord,
@@ -31304,6 +31412,7 @@ export {
31304
31412
  deleteHostedZone as r53DeleteHostedZone,
31305
31413
  createHostedZone as r53CreateHostedZone,
31306
31414
  checkAvailability3 as r53CheckAvailability,
31415
+ pollRegistrationUntilDone,
31307
31416
  markDomainPremium,
31308
31417
  listSslExpiring,
31309
31418
  listExpiring,
@@ -31324,6 +31433,7 @@ export {
31324
31433
  getDomain,
31325
31434
  getDnsRecord,
31326
31435
  getDatabase,
31436
+ getCapability,
31327
31437
  getByRegistrar,
31328
31438
  getAvailableProviders,
31329
31439
  getAlert,
@@ -31333,17 +31443,26 @@ export {
31333
31443
  deleteDomain,
31334
31444
  deleteDnsRecord,
31335
31445
  deleteAlert,
31446
+ delegateDomainToCloudflare,
31336
31447
  createRoute53Provider,
31337
31448
  createDomainOffer,
31338
31449
  createDomain,
31339
31450
  createDnsRecord,
31340
31451
  createAlert,
31341
31452
  countDomains,
31453
+ cloudflareAuthHeaders,
31342
31454
  closeDatabase,
31455
+ classifyRegistrationStatus,
31343
31456
  checkSsl,
31344
31457
  checkDnsPropagation,
31345
31458
  checkAllDomains,
31459
+ upsertRecord2 as cfUpsertRecord,
31460
+ getZone as cfGetZone,
31461
+ ensureZone as cfEnsureZone,
31462
+ createZone as cfCreateZone,
31463
+ canBuy,
31346
31464
  autoDetectRegistrar,
31465
+ PROVIDER_CAPABILITIES,
31347
31466
  DOMAIN_STATUSES,
31348
31467
  DOMAIN_OFFER_STATUSES,
31349
31468
  DOMAIN_EMAIL_TYPES
@@ -11,9 +11,29 @@
11
11
  */
12
12
  export interface BrandsightConfig {
13
13
  apiKey: string;
14
+ apiSecret?: string;
15
+ customerId?: string;
16
+ shopperId?: string;
14
17
  accountId?: string;
15
18
  baseUrl?: string;
16
19
  }
20
+ /**
21
+ * Resolve Brandsight (GoDaddy Corporate Domains) credentials from env, including
22
+ * the HASNAXYZ vault names which carry the full GoDaddy-style credential set
23
+ * (api_key + api_secret + customer_id + shopper_id). Pure / testable.
24
+ */
25
+ export declare function resolveBrandsightConfig(env?: Record<string, string | undefined>): BrandsightConfig;
26
+ export interface BrandsightCapability {
27
+ configured: boolean;
28
+ gated: boolean;
29
+ notes: string;
30
+ }
31
+ /**
32
+ * Brandsight is GoDaddy Corporate Domains — an enterprise/contract-only
33
+ * registrar. Even with credentials present, automated self-serve purchase is
34
+ * gated, so callers must not attempt it blindly.
35
+ */
36
+ export declare function brandsightCapability(env?: Record<string, string | undefined>): BrandsightCapability;
17
37
  export interface BrandsightDomain {
18
38
  domain: string;
19
39
  status: string;
@@ -1 +1 @@
1
- {"version":3,"file":"brandsight.d.ts","sourceRoot":"","sources":["../../src/lib/brandsight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brandsight.d.ts","sourceRoot":"","sources":["../../src/lib/brandsight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Registrar / DNS provider capability matrix (2026) and auto-selection.
3
+ *
4
+ * Captures what each provider can actually do via API, so callers never attempt
5
+ * a gated path silently. Findings (research, 2026):
6
+ * - Route53 Domains: full self-serve buy API, not volume-gated → primary buy.
7
+ * - GoDaddy retail: Domains API gated behind account thresholds (≥10 / DDC)
8
+ * since 2024; purchase + DNS writes unreliable → gated.
9
+ * - Brandsight / GoDaddy Corporate Domains: enterprise-contract-only → gated.
10
+ * - Cloudflare: DNS only (no registration) → always our DNS.
11
+ * - Namecheap: buy + DNS via API (sandbox/whitelist required) → usable.
12
+ */
13
+ export interface ProviderCapability {
14
+ canBuy: boolean;
15
+ canDns: boolean;
16
+ /** True when the API path exists but requires special access we may not have. */
17
+ gated: boolean;
18
+ notes: string;
19
+ }
20
+ export declare const PROVIDER_CAPABILITIES: Record<string, ProviderCapability>;
21
+ export declare function getCapability(name: string): ProviderCapability;
22
+ export declare function canBuy(name: string): boolean;
23
+ /**
24
+ * Choose the registrar to buy through. Defaults to Route53 (the only reliable
25
+ * self-serve API). An explicit preference is honored only if it is non-gated.
26
+ */
27
+ export declare function selectBuyRegistrar(preference?: string): string;
28
+ /** DNS is always Cloudflare, regardless of where the domain was bought. */
29
+ export declare function selectDnsProvider(): string;
30
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/lib/capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAMpE,CAAC;AAIF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAE9D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cloudflare auth resolution for open-domains — supports BOTH a scoped API
3
+ * token and a Global API Key + email (our vault stores the latter:
4
+ * HASNAXYZ_CLOUDFLARE_LIVE_API_KEY / _EMAIL). Pure + testable.
5
+ */
6
+ export interface CloudflareConfig {
7
+ apiToken?: string;
8
+ apiKey?: string;
9
+ email?: string;
10
+ accountId?: string;
11
+ }
12
+ export declare function resolveCloudflareConfig(env?: Record<string, string | undefined>): CloudflareConfig;
13
+ /** The auth headers to send for a given config. */
14
+ export declare function cloudflareAuthHeaders(cfg: CloudflareConfig): Record<string, string>;
15
+ //# sourceMappingURL=cloudflare-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-auth.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare-auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CACrC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,GAC1F,gBAAgB,CAqBlB;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMnF"}
@@ -6,10 +6,8 @@
6
6
  * CLOUDFLARE_ACCOUNT_ID — Account ID (required for zone creation)
7
7
  */
8
8
  import type { DnsProvider } from "./registrar.js";
9
- export interface CloudflareConfig {
10
- apiToken?: string;
11
- accountId?: string;
12
- }
9
+ import { type CloudflareConfig } from "./cloudflare-auth.js";
10
+ export type { CloudflareConfig };
13
11
  export interface CloudflareZone {
14
12
  id: string;
15
13
  name: string;
@@ -30,6 +28,17 @@ export declare function getConfig(): CloudflareConfig;
30
28
  export declare function listZones(config?: CloudflareConfig): Promise<CloudflareZone[]>;
31
29
  export declare function getZone(domain: string, config?: CloudflareConfig): Promise<CloudflareZone | null>;
32
30
  export declare function createZone(domain: string, config?: CloudflareConfig): Promise<CloudflareZone>;
31
+ /**
32
+ * Find-or-create a Cloudflare zone and return its assigned nameservers.
33
+ * Idempotent: reuses an existing zone for the domain if present. The returned
34
+ * nameservers are what the registrar should be delegated to (always-Cloudflare).
35
+ *
36
+ * `deps` is injectable for testing; defaults to the real getZone/createZone.
37
+ */
38
+ export declare function ensureZone(domain: string, config?: CloudflareConfig, deps?: {
39
+ getZone: (d: string, c?: CloudflareConfig) => Promise<CloudflareZone | null>;
40
+ createZone: (d: string, c?: CloudflareConfig) => Promise<CloudflareZone>;
41
+ }): Promise<CloudflareZone>;
33
42
  export declare function deleteZone(zoneId: string, config?: CloudflareConfig): Promise<void>;
34
43
  export declare function listRecords(zoneId: string, config?: CloudflareConfig): Promise<CloudflareRecord[]>;
35
44
  export declare function upsertRecord(zoneId: string, record: CloudflareRecord, config?: CloudflareConfig): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,gBAAgB,CAAC;AAIrE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,SAAS,IAAI,gBAAgB,CAK5C;AAwCD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAkBpF;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQvG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAUnG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkBxG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrH;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjI;AAID,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,WAAW,CA4B/E"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAIjC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAqCD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAkBpF;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQvG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAUnG;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,EACzB,IAAI,CAAC,EAAE;IACL,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7E,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E,GACA,OAAO,CAAC,cAAc,CAAC,CASzB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkBxG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrH;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjI;AAID,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,WAAW,CA4B/E"}
@@ -16,8 +16,18 @@ export interface DomainContact {
16
16
  export interface DomainsConfig {
17
17
  default_registrar?: string;
18
18
  default_dns?: string;
19
+ /** AWS profile/account used for domain purchases (Route53 Domains). */
20
+ purchase_aws_profile?: string;
19
21
  contact?: DomainContact;
20
22
  }
23
+ /**
24
+ * AWS profile to use for domain purchases. For this app, domains are bought in
25
+ * the hasna-xyz-infra account. Resolved from config, then env. Applying it sets
26
+ * process.env.AWS_PROFILE when no explicit AWS creds are already present.
27
+ */
28
+ export declare function getPurchaseProfile(): string | undefined;
29
+ /** Set AWS_PROFILE from config for purchase ops if no explicit creds are set. */
30
+ export declare function applyPurchaseProfile(): string | undefined;
21
31
  export declare function loadConfig(): DomainsConfig;
22
32
  export declare function saveConfig(config: DomainsConfig): void;
23
33
  export declare function setConfigKey(keyPath: string, value: string): DomainsConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAMD,wBAAgB,UAAU,IAAI,aAAa,CAQ1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAKtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAe1E;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CAC9C,GAAG;IACF,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IACpE,cAAc,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9C,CA2BA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUhE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAKzD;AAMD,wBAAgB,UAAU,IAAI,aAAa,CAQ1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAKtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAe1E;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CAC9C,GAAG;IACF,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IACpE,cAAc,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9C,CA2BA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUhE"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Provisioning credential status — reports, per provider, whether usable
3
+ * credentials are present (across all supported auth modes incl. HASNAXYZ vault
4
+ * env names). Pure (env injected) + used by `domains doctor`.
5
+ */
6
+ export interface CredStatus {
7
+ provider: string;
8
+ configured: boolean;
9
+ mode: string;
10
+ detail: string;
11
+ }
12
+ export declare function checkProvisioningCredentials(env?: Record<string, string | undefined>): CredStatus[];
13
+ //# sourceMappingURL=creds-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creds-check.d.ts","sourceRoot":"","sources":["../../src/lib/creds-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,GAC1F,UAAU,EAAE,CAqCd"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Real deps for the domain provisioning daemon — gather live signals and run
3
+ * the next action for a domain (toward "ready" = registered + CF zone + NS
4
+ * delegated + propagated + zone active). DNS is always Cloudflare.
5
+ */
6
+ import type { DomainReconcileDeps } from "./domain-daemon.js";
7
+ export declare function makeDomainDaemonDeps(): DomainReconcileDeps;
8
+ //# sourceMappingURL=domain-daemon-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-daemon-deps.d.ts","sourceRoot":"","sources":["../../src/lib/domain-daemon-deps.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAS9D,wBAAgB,oBAAoB,IAAI,mBAAmB,CAwC1D"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Domain provisioning daemon — reconciles a set of domains toward `ready`.
3
+ *
4
+ * Each tick: gather live signals per domain, derive its lifecycle state, and run
5
+ * the next action (register / create_cf_zone / delegate_ns / check_ns_propagation
6
+ * / verify_dns / finalize). Signals + actions are injected so the loop is fully
7
+ * testable; the CLI wires real Route53/Cloudflare/DNS calls. State is derived
8
+ * live (no separate persistence needed), so a restart simply re-derives.
9
+ */
10
+ import { type DomainSignals, type DomainProvAction } from "./provision-state.js";
11
+ export interface DomainReconcileDeps {
12
+ gatherSignals: (domain: string) => Promise<DomainSignals>;
13
+ runAction: (domain: string, action: DomainProvAction) => Promise<void>;
14
+ log?: (event: string, detail: Record<string, unknown>) => void;
15
+ }
16
+ export interface DomainReconcileSummary {
17
+ processed: number;
18
+ advanced: number;
19
+ ready: number;
20
+ errors: number;
21
+ }
22
+ export declare function reconcileDomainTick(domains: string[], deps: DomainReconcileDeps): Promise<DomainReconcileSummary>;
23
+ export interface DomainDaemonOptions extends DomainReconcileDeps {
24
+ intervalSec?: number;
25
+ maxTicks?: number;
26
+ shouldStop?: () => boolean;
27
+ sleep?: (ms: number) => Promise<void>;
28
+ }
29
+ export declare function runDomainDaemon(domains: () => Promise<string[]>, opts: DomainDaemonOptions): Promise<DomainReconcileSummary>;
30
+ //# sourceMappingURL=domain-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-daemon.d.ts","sourceRoot":"","sources":["../../src/lib/domain-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAyBjC;AAED,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAiBjC"}
@@ -66,5 +66,17 @@ export declare function syncToLocalDb(dbFns: {
66
66
  createDomain: (input: CreateDomainInput) => Domain;
67
67
  updateDomain: (id: string, input: UpdateDomainInput) => Domain | null;
68
68
  }): Promise<GoDaddySyncResult>;
69
+ export interface GodaddyCapability {
70
+ configured: boolean;
71
+ gated: boolean;
72
+ notes: string;
73
+ }
74
+ /**
75
+ * GoDaddy retail Domains API capability. Since 2024 GoDaddy gated the Domains
76
+ * API behind account thresholds (>=10 domains / Discount Domain Club): the
77
+ * availability endpoint often still works, but production purchase and DNS
78
+ * writes require a qualifying account. We therefore treat purchase/DNS as gated.
79
+ */
80
+ export declare function godaddyCapability(env?: Record<string, string | undefined>): GodaddyCapability;
69
81
  export {};
70
82
  //# sourceMappingURL=godaddy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/lib/godaddy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"godaddy.d.ts","sourceRoot":"","sources":["../../src/lib/godaddy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * NS drift reconciler — enforces the always-Cloudflare-DNS invariant across the
3
+ * portfolio: every domain's nameservers must point to Cloudflare. Detects drift
4
+ * (registrar NS not Cloudflare) and can re-delegate. Pure detection + an
5
+ * injected reconcile loop, so it is fully testable.
6
+ */
7
+ export declare function isCloudflareNs(ns: string[]): boolean;
8
+ export interface NsDriftVerdict {
9
+ domain: string;
10
+ drifted: boolean;
11
+ reason: string;
12
+ }
13
+ export declare function classifyNsDrift(domain: string, registrarNs: string[]): NsDriftVerdict;
14
+ export interface NsReconcileDeps {
15
+ getRegistrarNs: (domain: string) => Promise<string[]>;
16
+ getCloudflareNs: (domain: string) => Promise<string[]>;
17
+ setRegistrarNs: (domain: string, ns: string[]) => Promise<void>;
18
+ log?: (event: string, detail: Record<string, unknown>) => void;
19
+ }
20
+ export interface NsReconcileSummary {
21
+ checked: number;
22
+ drifted: NsDriftVerdict[];
23
+ fixed: string[];
24
+ errors: number;
25
+ }
26
+ export declare function reconcileNsDrift(domains: string[], deps: NsReconcileDeps, opts?: {
27
+ fix?: boolean;
28
+ }): Promise<NsReconcileSummary>;
29
+ //# sourceMappingURL=ns-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ns-drift.d.ts","sourceRoot":"","sources":["../../src/lib/ns-drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAIrF;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,eAAe,EACrB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAwB7B"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Domain provisioning state machine (open-domains side) — pure transitions plus
3
+ * a `deriveDomainState` that maps live signals (registered? zone? NS delegated?
4
+ * propagated? active?) to the current lifecycle state. The CLI `provision-status`
5
+ * command derives state live so no extra persistence is required, while the
6
+ * daemon advances domains transition-by-transition.
7
+ */
8
+ export type DomainProvState = "requested" | "registered" | "cf_zone_ready" | "ns_delegated" | "ns_propagated" | "dns_managed" | "ready" | "failed";
9
+ export type DomainProvAction = "register" | "create_cf_zone" | "delegate_ns" | "check_ns_propagation" | "verify_dns" | "finalize";
10
+ interface Step {
11
+ action: DomainProvAction;
12
+ next: DomainProvState;
13
+ }
14
+ export declare const DOMAIN_FLOW: Record<Exclude<DomainProvState, "ready" | "failed">, Step>;
15
+ export declare function isDomainTerminal(s: DomainProvState): boolean;
16
+ export declare function domainActionFor(s: DomainProvState): DomainProvAction | null;
17
+ export declare function domainNext(s: DomainProvState): DomainProvState | null;
18
+ export declare function domainHappyPath(): DomainProvState[];
19
+ export interface DomainSignals {
20
+ registered?: boolean;
21
+ zoneExists?: boolean;
22
+ registrarNsAreCloudflare?: boolean;
23
+ publicNsAreCloudflare?: boolean;
24
+ zoneActive?: boolean;
25
+ }
26
+ /** Map observed live signals to the furthest lifecycle state reached. */
27
+ export declare function deriveDomainState(sig: DomainSignals): DomainProvState;
28
+ export {};
29
+ //# sourceMappingURL=provision-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision-state.d.ts","sourceRoot":"","sources":["../../src/lib/provision-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,YAAY,GACZ,eAAe,GACf,cAAc,GACd,eAAe,GACf,aAAa,GACb,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,gBAAgB,GAChB,aAAa,GACb,sBAAsB,GACtB,YAAY,GACZ,UAAU,CAAC;AAEf,UAAU,IAAI;IAAG,MAAM,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAElE,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,GAAG,QAAQ,CAAC,EAAE,IAAI,CAOlF,CAAC;AAIF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAE5D;AACD,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAG3E;AACD,wBAAgB,UAAU,CAAC,CAAC,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI,CAGrE;AACD,wBAAgB,eAAe,IAAI,eAAe,EAAE,CAEnD;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAOrE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Route53 domain-registration polling — pure, reusable by the buy command and
3
+ * the domain provisioning daemon. The AWS status string is classified into a
4
+ * terminal/pending verdict; pollRegistrationUntilDone drives it to completion
5
+ * with an injectable status getter + sleep (so it is fully unit-testable).
6
+ */
7
+ export type RegVerdict = "pending" | "success" | "failed";
8
+ export declare function classifyRegistrationStatus(status: string): RegVerdict;
9
+ export interface PollResult {
10
+ status: "success" | "failed" | "timeout";
11
+ attempts: number;
12
+ message?: string;
13
+ }
14
+ export interface PollOptions {
15
+ getStatus: (operationId: string) => Promise<{
16
+ status: string;
17
+ message?: string;
18
+ }>;
19
+ maxAttempts?: number;
20
+ intervalMs?: number;
21
+ sleep?: (ms: number) => Promise<void>;
22
+ }
23
+ export declare function pollRegistrationUntilDone(operationId: string, opts: PollOptions): Promise<PollResult>;
24
+ //# sourceMappingURL=registration-poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-poll.d.ts","sourceRoot":"","sources":["../../src/lib/registration-poll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAKrE;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,UAAU,CAAC,CAerB"}
@@ -1,8 +1,9 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  export declare const MCP_HTTP_HOST = "127.0.0.1";
3
3
  export declare const MCP_SERVER_NAME = "domains";
4
- export declare const DEFAULT_MCP_HTTP_PORT = 8814;
4
+ export declare const DEFAULT_MCP_HTTP_PORT = 8859;
5
5
  export declare function isHttpMode(argv: readonly string[]): boolean;
6
+ export declare function isStdioMode(argv: readonly string[]): boolean;
6
7
  export declare function resolveMcpHttpPort(argv: readonly string[]): number;
7
8
  export declare function mcpHealthJson(): {
8
9
  status: string;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,eAAe,YAAY,CAAC;AACzC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CASlE;AAED,wBAAgB,aAAa,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAEhE;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,SAAS,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,SAAS,EAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAmB7C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAAG"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,eAAe,YAAY,CAAC;AACzC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE3D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CASlE;AAED,wBAAgB,aAAa,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAEhE;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,SAAS,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,SAAS,EAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAmB7C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAAG"}