authflow-cli 0.4.1 → 0.6.0

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 (79) hide show
  1. package/README.md +62 -341
  2. package/dist/checks.d.ts +30 -0
  3. package/dist/checks.js +36 -0
  4. package/dist/checks.js.map +1 -0
  5. package/dist/client-conformance.d.ts +5 -1
  6. package/dist/client-conformance.js +9 -1
  7. package/dist/client-conformance.js.map +1 -1
  8. package/dist/commands/account.d.ts +2 -0
  9. package/dist/commands/account.js +105 -0
  10. package/dist/commands/account.js.map +1 -0
  11. package/dist/commands/doctor.js +5 -1
  12. package/dist/commands/doctor.js.map +1 -1
  13. package/dist/commands/mcp.js +11 -6
  14. package/dist/commands/mcp.js.map +1 -1
  15. package/dist/commands/plan.js +7 -7
  16. package/dist/commands/plan.js.map +1 -1
  17. package/dist/commands/register.js +30 -2
  18. package/dist/commands/register.js.map +1 -1
  19. package/dist/commands/set-domain.d.ts +34 -0
  20. package/dist/commands/set-domain.js +162 -0
  21. package/dist/commands/set-domain.js.map +1 -0
  22. package/dist/commands/signup.d.ts +1 -0
  23. package/dist/commands/signup.js +4 -50
  24. package/dist/commands/signup.js.map +1 -1
  25. package/dist/config.d.ts +36 -1
  26. package/dist/config.js +1 -1
  27. package/dist/config.js.map +1 -1
  28. package/dist/credentials.d.ts +22 -0
  29. package/dist/credentials.js +206 -0
  30. package/dist/credentials.js.map +1 -0
  31. package/dist/custom-domain.d.ts +96 -0
  32. package/dist/custom-domain.js +289 -0
  33. package/dist/custom-domain.js.map +1 -0
  34. package/dist/doctor.d.ts +31 -23
  35. package/dist/doctor.js +271 -57
  36. package/dist/doctor.js.map +1 -1
  37. package/dist/google-redirect.d.ts +5 -1
  38. package/dist/google-redirect.js +11 -5
  39. package/dist/google-redirect.js.map +1 -1
  40. package/dist/integration-plans.json +80 -0
  41. package/dist/integration.d.ts +17 -23
  42. package/dist/integration.js +29 -236
  43. package/dist/integration.js.map +1 -1
  44. package/dist/login.d.ts +11 -0
  45. package/dist/login.js +181 -0
  46. package/dist/login.js.map +1 -0
  47. package/dist/management.d.ts +17 -0
  48. package/dist/management.js +67 -0
  49. package/dist/management.js.map +1 -0
  50. package/dist/mcp/management-server.d.ts +4 -0
  51. package/dist/mcp/management-server.js +103 -0
  52. package/dist/mcp/management-server.js.map +1 -0
  53. package/dist/mcp/server.d.ts +8 -1
  54. package/dist/mcp/server.js +137 -7
  55. package/dist/mcp/server.js.map +1 -1
  56. package/dist/program.js +6 -1
  57. package/dist/program.js.map +1 -1
  58. package/dist/rail.d.ts +16 -0
  59. package/dist/rail.js +43 -0
  60. package/dist/rail.js.map +1 -1
  61. package/dist/resource-urls.d.ts +27 -0
  62. package/dist/resource-urls.js +56 -0
  63. package/dist/resource-urls.js.map +1 -0
  64. package/dist/secrets.d.ts +29 -14
  65. package/dist/secrets.js +201 -90
  66. package/dist/secrets.js.map +1 -1
  67. package/dist/status.d.ts +15 -1
  68. package/dist/status.js +68 -6
  69. package/dist/status.js.map +1 -1
  70. package/dist/surface.d.ts +1 -0
  71. package/dist/surface.js +1 -0
  72. package/dist/surface.js.map +1 -1
  73. package/dist/tenant-host.d.ts +49 -0
  74. package/dist/tenant-host.js +367 -0
  75. package/dist/tenant-host.js.map +1 -0
  76. package/dist/version.d.ts +10 -0
  77. package/dist/version.js +27 -0
  78. package/dist/version.js.map +1 -0
  79. package/package.json +6 -5
package/dist/secrets.js CHANGED
@@ -1,117 +1,228 @@
1
1
  import { spawn } from "node:child_process";
2
- import { appendFile, chmod, readFile, writeFile } from "node:fs/promises";
3
- import { dirname, resolve } from "node:path";
2
+ import { createHash, randomBytes } from "node:crypto";
3
+ import { constants } from "node:fs";
4
+ import { access, appendFile, lstat, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
5
+ import { basename, dirname, join, resolve } from "node:path";
4
6
  export const secretTargets = ["user-secrets", "env-file", "keyvault"];
5
- /** Config key the .NET verifier and the origin proxy both read the usage-reporting key from. */
6
7
  export const originApiKeyConfigKey = "Authflow:OriginApiKey";
7
- /** Environment variable form of the same setting, for non-.NET origins. */
8
8
  export const originApiKeyEnvVar = "AUTHFLOW_ORIGIN_API_KEY";
9
- /** Per-tenant admin key used by `init`, `register`, and `authflow mcp`. */
10
9
  export const adminApiKeyEnvVar = "AUTHFLOW_ADMIN_API_KEY";
11
- /** Human-readable description of where the secret landed, for the receipt and console. */
12
- /** Writes AUTHFLOW_ADMIN_API_KEY to an env file. Signup's default so the key is not only in stdout. */
13
- export async function writeAdminApiKey(request) {
14
- return writeNamedEnvVar(adminApiKeyEnvVar, request.value, request.destination);
10
+ /** Resolve the destination before a one-time key is issued. Never prints child output or secrets. */
11
+ export async function prepareOriginApiKey(request) {
12
+ if (!secretTargets.includes(request.target))
13
+ throw new Error("Choose user-secrets, env-file, or keyvault.");
14
+ if (!request.destination?.trim())
15
+ throw new Error("Choose an explicit --secret-destination before issuing an origin key.");
16
+ if (request.target === "user-secrets") {
17
+ const path = resolve(request.destination);
18
+ let project = path;
19
+ if ((await stat(path)).isDirectory()) {
20
+ const projects = (await readdir(path)).filter(name => /\.(cs|fs|vb)proj$/i.test(name));
21
+ if (projects.length !== 1)
22
+ throw new Error("The user-secrets destination must identify one .NET project.");
23
+ project = join(path, projects[0]);
24
+ }
25
+ const inspected = await secretProcess.run("dotnet", ["msbuild", project, "-getProperty:UserSecretsId", "-nologo"]);
26
+ if (inspected.code !== 0 || !inspected.stdout.trim() || /[\r\n]/.test(inspected.stdout.trim()))
27
+ throw new Error("The project must have a UserSecretsId. Initialize user-secrets in that project before issuing the key.");
28
+ return {
29
+ description: `dotnet user-secrets (${originApiKeyConfigKey}) in ${project}`,
30
+ write: async (value) => {
31
+ const result = await secretProcess.run("dotnet", ["user-secrets", "set", "--project", project], JSON.stringify({ [originApiKeyConfigKey]: value }));
32
+ if (result.code !== 0)
33
+ throw new Error("The origin key could not be saved to .NET user-secrets.");
34
+ },
35
+ };
36
+ }
37
+ if (request.target === "env-file")
38
+ return prepareEnvFile(originApiKeyEnvVar, request.destination);
39
+ const vault = request.destination.toLowerCase();
40
+ if (!/^[a-z][a-z0-9-]{1,22}[a-z0-9]$/.test(vault) || vault.includes("--"))
41
+ throw new Error("The Key Vault destination must be an Azure vault name, not a URL.");
42
+ if (!request.resource)
43
+ throw new Error("Key Vault delivery requires a workspace-scoped resource command.");
44
+ const name = originSecretName(request.resource);
45
+ const login = await secretProcess.run("az", ["account", "get-access-token", "--resource", "https://vault.azure.net", "--query", "accessToken", "--output", "tsv", "--only-show-errors"]);
46
+ const token = login.stdout.trim();
47
+ if (login.code !== 0 || !token || /\s/.test(token))
48
+ throw new Error("Sign in to the intended Azure account before issuing the origin key.");
49
+ const reference = `https://${vault}.vault.azure.net/secrets/${name}`;
50
+ await preflightVault(reference, token);
51
+ return {
52
+ description: reference,
53
+ write: async (value) => {
54
+ let response;
55
+ try {
56
+ response = await fetch(`${reference}?api-version=7.4`, {
57
+ method: "PUT", redirect: "error", signal: AbortSignal.timeout(30_000),
58
+ headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
59
+ body: JSON.stringify({ value }),
60
+ });
61
+ }
62
+ catch {
63
+ throw new Error("Key Vault delivery failed. The key may not have been saved; inspect the destination before rotating again.");
64
+ }
65
+ // Key Vault responses can include the secret value. Neither success nor error bodies are printed.
66
+ if (!response.ok)
67
+ throw new Error(`Key Vault refused secret delivery (${response.status}). Check the selected account, vault and secret-write permission.`);
68
+ await response.body?.cancel();
69
+ },
70
+ };
15
71
  }
16
- export async function writeOriginApiKey(request) {
17
- switch (request.target) {
18
- case "user-secrets":
19
- return writeUserSecret(request);
20
- case "env-file":
21
- return writeEnvFile(request);
22
- case "keyvault":
23
- return writeKeyVault(request);
72
+ async function preflightVault(reference, token) {
73
+ let response;
74
+ try {
75
+ // Versions list returns metadata only. Never retrieve the existing secret value.
76
+ response = await fetch(`${reference}/versions?api-version=7.4&maxresults=1`, {
77
+ method: "GET", redirect: "error", signal: AbortSignal.timeout(15_000),
78
+ headers: { Authorization: `Bearer ${token}` },
79
+ });
80
+ }
81
+ catch {
82
+ throw new Error("The selected Key Vault could not be reached. Fix the destination before issuing the origin key.");
83
+ }
84
+ if (response.ok) {
85
+ await response.body?.cancel();
86
+ return;
87
+ }
88
+ const codes = [];
89
+ try {
90
+ const reader = response.body?.getReader();
91
+ const chunks = [];
92
+ let length = 0;
93
+ if (reader) {
94
+ try {
95
+ for (;;) {
96
+ const { value, done } = await reader.read();
97
+ if (done)
98
+ break;
99
+ length += value.byteLength;
100
+ if (length > 16_384)
101
+ throw new Error("Oversized metadata error.");
102
+ chunks.push(value);
103
+ }
104
+ }
105
+ finally {
106
+ await reader.cancel();
107
+ }
108
+ }
109
+ let error = JSON.parse(Buffer.concat(chunks).toString("utf8")).error;
110
+ for (let depth = 0; depth < 4 && error && typeof error === "object"; depth++) {
111
+ const current = error;
112
+ if (typeof current.code === "string")
113
+ codes.push(current.code.toLowerCase());
114
+ error = current.innererror;
115
+ }
24
116
  }
117
+ catch { /* No response content or diagnostic message is ever exposed. */ }
118
+ if (codes.some(code => ["vaultnotfound", "forbiddenbyfirewall", "forbiddenbyconnection"].includes(code)))
119
+ throw new Error("The selected Key Vault is unavailable or blocks this connection. Fix the destination before issuing the origin key.");
120
+ if (response.status === 404 && codes.includes("secretnotfound"))
121
+ return;
122
+ // Listing and writing have separate permissions; a valid write-only principal may receive 403.
123
+ // This probe establishes reachability, not secrets/set authorization. Delivery still may fail.
124
+ if (response.status === 403)
125
+ return;
126
+ throw new Error(`Key Vault destination preflight failed (${response.status}). Check the selected account and vault before issuing the origin key.`);
25
127
  }
26
- async function writeUserSecret(request) {
27
- const project = request.destination ?? ".";
28
- await run("dotnet", ["user-secrets", "set", originApiKeyConfigKey, request.value, "--project", project]);
29
- return `dotnet user-secrets (${originApiKeyConfigKey}) in ${resolve(project)}`;
128
+ /** Stable across retries; separates resources, workspaces and staging/production issuers. */
129
+ export function originSecretName(resource) {
130
+ if (!/^[a-z0-9][a-z0-9-]{0,31}$/.test(resource.slug) || !resource.issuer || !resource.workspaceId)
131
+ throw new Error("A scoped resource is required to name its origin secret.");
132
+ const scope = createHash("sha256").update(JSON.stringify([resource.issuer.replace(/\/+$/, ""), resource.workspaceId, resource.slug])).digest("hex").slice(0, 16);
133
+ return `authflow-${resource.slug}-origin-${scope}`;
30
134
  }
31
- async function writeEnvFile(request) {
32
- return writeNamedEnvVar(originApiKeyEnvVar, request.value, request.destination);
135
+ export async function writeOriginApiKey(request) {
136
+ const prepared = await prepareOriginApiKey({ ...request, destination: request.destination ?? (request.target === "user-secrets" ? "." : request.target === "env-file" ? ".env.local" : undefined) });
137
+ await prepared.write(request.value);
138
+ return prepared.description;
33
139
  }
34
- async function writeNamedEnvVar(name, value, destination) {
35
- const path = resolve(destination ?? ".env.local");
36
- const line = `${name}=${value}\n`;
37
- const existing = await readFileOrEmpty(path);
38
- const next = existing ? `${stripVar(existing, name)}${line}` : line;
39
- await writeFile(path, next, "utf8");
40
- // Best-effort: a no-op on Windows, which is exactly why this is not the recommended target.
41
- await chmod(path, 0o600).catch(() => undefined);
42
- await ensureGitIgnored(path);
43
- return path;
140
+ export async function writeAdminApiKey(request) {
141
+ const prepared = await prepareEnvFile(adminApiKeyEnvVar, request.destination ?? ".env.local");
142
+ await prepared.write(request.value);
143
+ return prepared.description;
44
144
  }
45
- async function writeKeyVault(request) {
46
- const vault = request.destination;
47
- if (!vault) {
48
- throw new Error("--secret-destination <vault-name> is required for --write-secrets keyvault.");
49
- }
50
- // Key Vault names cannot contain ':'; keep the mapping mechanical so it is guessable from config.
51
- const name = originApiKeyConfigKey.replace(/:/g, "--");
52
- await run("az", ["keyvault", "secret", "set", "--vault-name", vault, "--name", name, "--value", request.value]);
53
- return `Azure Key Vault ${vault}/${name}`;
145
+ async function prepareEnvFile(name, destination) {
146
+ const path = resolve(destination);
147
+ await access(dirname(path), constants.W_OK);
148
+ const existing = await lstat(path).catch((error) => { if (error.code === "ENOENT")
149
+ return undefined; throw error; });
150
+ if (existing && (!existing.isFile() || existing.isSymbolicLink()))
151
+ throw new Error("The env-file destination must be a regular file, not a symbolic link.");
152
+ if (existing)
153
+ await access(path, constants.W_OK);
154
+ const tracked = await secretProcess.run("git", ["-C", dirname(path), "ls-files", "--error-unmatch", "--", basename(path)]);
155
+ if (tracked.code === 0)
156
+ throw new Error("The env-file destination is tracked by git. Choose an untracked local secret file.");
157
+ if (tracked.code !== 1 && tracked.code !== 128)
158
+ throw new Error("Could not verify that the env-file destination is untracked.");
159
+ await readFileOrEmpty(path); // Permission/read failures must happen before key issuance where possible.
160
+ return {
161
+ description: path,
162
+ write: async (value) => {
163
+ if (/[\r\n]/.test(value))
164
+ throw new Error("An origin credential must fit on one env-file line.");
165
+ const current = await lstat(path).catch((error) => { if (error.code === "ENOENT")
166
+ return undefined; throw error; });
167
+ if (current && (!current.isFile() || current.isSymbolicLink()))
168
+ throw new Error("The env-file destination changed. Secret delivery stopped.");
169
+ const contents = await readFileOrEmpty(path);
170
+ const kept = contents.split(/\r?\n/).filter(line => !line.startsWith(`${name}=`)).join("\n").replace(/\n+$/, "");
171
+ const next = `${kept ? kept + "\n" : ""}${name}=${value}\n`;
172
+ await ensureGitIgnored(path);
173
+ const temporary = join(dirname(path), `.authflow-secret-${randomBytes(16).toString("hex")}`);
174
+ try {
175
+ await writeFile(temporary, next, { encoding: "utf8", mode: 0o600, flag: "wx" });
176
+ await rename(temporary, path);
177
+ }
178
+ finally {
179
+ await rm(temporary, { force: true });
180
+ }
181
+ },
182
+ };
54
183
  }
55
- /**
56
- * Adds the secret file to .gitignore if it is not already covered.
57
- *
58
- * Deliberately conservative: it only appends when the exact pattern is absent, because a
59
- * false-negative here costs one duplicate line and a false-positive leaks a credential.
60
- */
61
184
  async function ensureGitIgnored(secretPath) {
62
- const gitignore = resolve(dirname(secretPath), ".gitignore");
63
- const pattern = secretPath.split(/[/\\]/).pop();
64
- if (!pattern) {
65
- return;
66
- }
185
+ const gitignore = join(dirname(secretPath), ".gitignore");
186
+ const pattern = `/${basename(secretPath).replace(/([*?\[\]\\])/g, "\\$1")}`;
67
187
  const existing = await readFileOrEmpty(gitignore);
68
- if (existing.split(/\r?\n/).some((line) => line.trim() === pattern)) {
69
- return;
70
- }
71
- const prefix = existing && !existing.endsWith("\n") ? "\n" : "";
72
- await appendFile(gitignore, `${prefix}${pattern}\n`, "utf8");
188
+ if (!existing.split(/\r?\n/).some(line => line.trim() === pattern))
189
+ await appendFile(gitignore, `${existing && !existing.endsWith("\n") ? "\n" : ""}${pattern}\n`, "utf8");
73
190
  }
74
191
  async function readFileOrEmpty(path) {
75
192
  try {
76
193
  return await readFile(path, "utf8");
77
194
  }
78
- catch {
79
- return "";
195
+ catch (error) {
196
+ if (error.code === "ENOENT")
197
+ return "";
198
+ throw error;
80
199
  }
81
200
  }
82
- function stripVar(contents, name) {
83
- const kept = contents
84
- .split(/\r?\n/)
85
- .filter((line) => !line.startsWith(`${name}=`))
86
- .join("\n")
87
- .replace(/\n+$/, "");
88
- return kept ? `${kept}\n` : "";
89
- }
90
- /**
91
- * Runs a tool with the secret in argv.
92
- *
93
- * `shell: false` matters: the secret is passed as a discrete argument, so no shell ever parses it
94
- * and a value containing quotes or `$` cannot turn into a command.
95
- */
96
- function run(command, args) {
201
+ /** One subprocess boundary for destination preflight and stdin delivery; all diagnostics are sanitized. */
202
+ async function run(command, args, stdin) {
97
203
  return new Promise((resolvePromise, reject) => {
98
- const child = spawn(command, [...args], { stdio: ["ignore", "ignore", "pipe"], shell: false });
99
- let stderr = "";
100
- child.stderr?.on("data", (chunk) => {
101
- stderr += chunk.toString();
102
- });
103
- child.on("error", (err) => {
104
- reject(err.code === "ENOENT"
105
- ? new Error(`${command} was not found on PATH. Install it or use --write-secrets env-file.`)
106
- : err);
107
- });
108
- child.on("close", (code) => {
109
- if (code === 0) {
110
- resolvePromise();
111
- return;
204
+ // Azure CLI ships az.cmd on Windows. Its only invocation here has fixed, nonsecret arguments.
205
+ const windowsAzure = process.platform === "win32" && command === "az";
206
+ if (windowsAzure && args.some(arg => !/^[a-zA-Z0-9.:/-]+$/.test(arg))) {
207
+ reject(new Error("Unsafe Azure CLI arguments."));
208
+ return;
209
+ }
210
+ const child = spawn(windowsAzure ? (process.env.ComSpec ?? "cmd.exe") : command, windowsAzure ? ["/d", "/s", "/c", "az", ...args] : [...args], { stdio: ["pipe", "pipe", "ignore"], shell: false, windowsHide: true });
211
+ let stdout = "";
212
+ const timeout = setTimeout(() => { child.kill(); reject(new Error(`${command} timed out while preparing or writing the secret destination.`)); }, 60_000);
213
+ child.stdout.on("data", (chunk) => {
214
+ stdout += chunk.toString();
215
+ if (stdout.length > 1_048_576) {
216
+ child.kill();
217
+ reject(new Error(`${command} returned an unexpectedly large response.`));
112
218
  }
113
- reject(new Error(`${command} exited with ${code}: ${stderr.trim().slice(0, 400)}`));
114
219
  });
220
+ child.stdin.on("error", () => { });
221
+ child.on("error", () => { clearTimeout(timeout); reject(new Error(`${command} is unavailable. Fix the destination before issuing the key.`)); });
222
+ child.on("close", code => { clearTimeout(timeout); resolvePromise({ code, stdout }); });
223
+ child.stdin.end(stdin);
115
224
  });
116
225
  }
226
+ export const secretProcess = { run };
227
+ export const secretDelivery = { prepare: prepareOriginApiKey };
117
228
  //# sourceMappingURL=secrets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
package/dist/status.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { RegistrationReceipt } from "./config.js";
1
+ import type { CustomDomainRecord, RegistrationReceipt } from "./config.js";
2
2
  /**
3
3
  * Turning a receipt into "what is done, what is left, and what do I type next".
4
4
  *
@@ -20,14 +20,28 @@ export type ReadinessStep = {
20
20
  name: string;
21
21
  done: boolean;
22
22
  detail: string;
23
+ /** Extra lines printed under the detail, such as the DNS records still to add. */
24
+ lines?: string[];
23
25
  /** What to run next. Absent once the step is done. */
24
26
  command?: string;
25
27
  };
28
+ /** The custom-domain claim, structured for `status --json` and for agents. */
29
+ export type ReadinessCustomDomain = {
30
+ host?: string;
31
+ path: string;
32
+ state?: string;
33
+ cnameTarget?: string;
34
+ records: CustomDomainRecord[];
35
+ lastError?: string;
36
+ checkedAt?: string;
37
+ };
26
38
  export type Readiness = {
27
39
  slug: string;
28
40
  status: string;
29
41
  ready: boolean;
30
42
  gatewayUrl?: string;
43
+ /** Present when the resource is, or is becoming, served on the tenant's own hostname. */
44
+ customDomain?: ReadinessCustomDomain;
31
45
  steps: ReadinessStep[];
32
46
  };
33
47
  export declare function resourceReadiness(receipt: RegistrationReceipt): Readiness;
package/dist/status.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { customDomainState, defaultPublicPath, formatDnsRecords, registrarNameHint, setDomainCommandLine, summarizeCustomDomain, } from "./custom-domain.js";
1
2
  /**
2
3
  * Turning a receipt into "what is done, what is left, and what do I type next".
3
4
  *
@@ -77,24 +78,77 @@ export function resourceReadiness(receipt) {
77
78
  : undefined,
78
79
  },
79
80
  ];
80
- // Conformance is not a receipt field: the rail records registration state, not whether the origin
81
- // has been exercised. Prompt for it whenever the origin exists so it is not silently skipped.
81
+ if (receipt.access_mode === "free")
82
+ steps.splice(2, 2);
83
+ if (blocked("paid_offer"))
84
+ steps.push({
85
+ name: "paid offer configured", done: false,
86
+ detail: "A paid MCP needs a positive price and credit allowance.",
87
+ command: `authflow resource update ${slug} --file offer.json`,
88
+ });
89
+ // A custom host is a requirement of its own: until the tenant's DNS is in place and the edge has
90
+ // a certificate, the resource's URL does not answer, and from the outside that looks exactly like
91
+ // an origin that was never wired up.
92
+ const customDomain = customDomainReadiness(receipt);
93
+ if (customDomain || blocked("custom_domain_dns")) {
94
+ const done = customDomain?.state === "ready" && !blocked("custom_domain_dns");
95
+ const records = customDomain?.records ?? [];
96
+ steps.push({
97
+ name: "custom domain DNS",
98
+ done,
99
+ detail: `${customDomain?.host ?? "(host not reported)"}: ${summarizeCustomDomain(receipt)}`,
100
+ lines: records.length > 0
101
+ ? [
102
+ "",
103
+ ...formatDnsRecords(records),
104
+ ...(!done && customDomain?.host ? ["", ...registrarNameHint(customDomain.host)] : []),
105
+ ]
106
+ : undefined,
107
+ command: done ? undefined : setDomainCommandLine(slug),
108
+ });
109
+ }
110
+ // Conformance is recorded on the receipt after POST /origin/v1/conformance. Prompt until
111
+ // a run has passed so it is not silently skipped, and stop prompting after a pass.
82
112
  if (receipt.origin_base_uri) {
113
+ const probed = receipt.last_probe_passed === true && !blocked("origin_verification");
114
+ const at = receipt.last_probe_at_utc?.trim();
83
115
  steps.push({
84
116
  name: "conformance probed",
85
- done: false,
86
- detail: "run the probe to confirm the origin fails closed on a bad identity header",
87
- command: "authflow probe",
117
+ done: probed,
118
+ detail: probed
119
+ ? `passed${at ? ` at ${at}` : ""}`
120
+ : at
121
+ ? `last run failed at ${at}`
122
+ : "run the probe to confirm the origin fails closed on a bad identity header",
123
+ command: probed ? undefined : "authflow probe",
88
124
  });
89
125
  }
90
126
  return {
91
127
  slug,
92
- status: receipt.status ?? (pending.length === 0 ? "live" : "draft"),
128
+ status: receipt.status ?? "draft",
93
129
  ready: pending.length === 0 && receipt.status === "live",
94
130
  gatewayUrl: receipt.gateway_url ?? receipt.resource,
131
+ customDomain,
95
132
  steps,
96
133
  };
97
134
  }
135
+ /** Undefined for a resource on the gateway host, so its status output does not change at all. */
136
+ function customDomainReadiness(receipt) {
137
+ const domain = receipt.custom_domain;
138
+ const host = receipt.public_host?.trim();
139
+ if (!domain && !host) {
140
+ return undefined;
141
+ }
142
+ return {
143
+ host,
144
+ path: receipt.public_path?.trim() || defaultPublicPath,
145
+ state: customDomainState(receipt),
146
+ cnameTarget: domain?.cname_target ?? undefined,
147
+ records: domain?.records ?? [],
148
+ lastError: domain?.last_error ?? undefined,
149
+ checkedAt: domain?.checked_at ?? undefined,
150
+ };
151
+ }
98
152
  function attachStripeCommand(slug) {
99
153
  return (`authflow connect --slug ${slug}` +
100
154
  ` (or authflow set-connected-account --slug ${slug} --account acct_…)`);
@@ -111,7 +165,15 @@ export function formatReadiness(readiness) {
111
165
  for (const step of readiness.steps) {
112
166
  lines.push(` ${step.done ? "[x]" : "[ ]"} ${step.name}`);
113
167
  lines.push(` ${step.detail}`);
168
+ const extras = step.lines ?? [];
169
+ for (const extra of extras) {
170
+ lines.push(extra ? ` ${extra}` : "");
171
+ }
114
172
  if (step.command) {
173
+ // Keep the command visually apart from a block of records it refers to.
174
+ if (extras.length > 0) {
175
+ lines.push("");
176
+ }
115
177
  lines.push(` next: ${step.command}`);
116
178
  }
117
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
package/dist/surface.d.ts CHANGED
@@ -15,6 +15,7 @@ export declare const mcpToolToCliCommand: {
15
15
  readonly authflow_start_stripe_connect: "connect";
16
16
  readonly authflow_set_connected_account: "set-connected-account";
17
17
  readonly authflow_set_origin: "set-origin";
18
+ readonly authflow_set_custom_domain: "set-domain";
18
19
  readonly authflow_probe: "probe";
19
20
  readonly authflow_mint_test_header: "mint-header";
20
21
  readonly authflow_rotate_origin_key: "rotate-origin-key";
package/dist/surface.js CHANGED
@@ -15,6 +15,7 @@ export const mcpToolToCliCommand = {
15
15
  authflow_start_stripe_connect: "connect",
16
16
  authflow_set_connected_account: "set-connected-account",
17
17
  authflow_set_origin: "set-origin",
18
+ authflow_set_custom_domain: "set-domain",
18
19
  authflow_probe: "probe",
19
20
  authflow_mint_test_header: "mint-header",
20
21
  authflow_rotate_origin_key: "rotate-origin-key",
@@ -1 +1 @@
1
- {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,eAAe,EAAE,QAAQ;IACzB,eAAe,EAAE,QAAQ;IACzB,0BAA0B,EAAE,UAAU;IACtC,qBAAqB,EAAE,KAAK;IAC5B,uBAAuB,EAAE,MAAM;IAC/B,eAAe,EAAE,QAAQ;IACzB,yBAAyB,EAAE,MAAM;IACjC,6BAA6B,EAAE,SAAS;IACxC,8BAA8B,EAAE,uBAAuB;IACvD,mBAAmB,EAAE,YAAY;IACjC,cAAc,EAAE,OAAO;IACvB,yBAAyB,EAAE,aAAa;IACxC,0BAA0B,EAAE,mBAAmB;CACvC,CAAC"}
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,eAAe,EAAE,QAAQ;IACzB,eAAe,EAAE,QAAQ;IACzB,0BAA0B,EAAE,UAAU;IACtC,qBAAqB,EAAE,KAAK;IAC5B,uBAAuB,EAAE,MAAM;IAC/B,eAAe,EAAE,QAAQ;IACzB,yBAAyB,EAAE,MAAM;IACjC,6BAA6B,EAAE,SAAS;IACxC,8BAA8B,EAAE,uBAAuB;IACvD,mBAAmB,EAAE,YAAY;IACjC,0BAA0B,EAAE,YAAY;IACxC,cAAc,EAAE,OAAO;IACvB,yBAAyB,EAAE,aAAa;IACxC,0BAA0B,EAAE,mBAAmB;CACvC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type PeerCertificate } from "node:tls";
2
+ import { type DoctorCheck } from "./checks.js";
3
+ import type { RegistrationReceipt } from "./config.js";
4
+ /**
5
+ * `authflow doctor --host`: does a tenant's own hostname work, end to end, from outside?
6
+ *
7
+ * The rail can report a custom domain as ready while a tenant's registrar still serves a stale
8
+ * record, and a rail-side check cannot tell, because the rail is not the one resolving the name.
9
+ * These checks look the way a client does: resolve the three records, handshake TLS, follow a plain
10
+ * http request, then fetch the discovery documents and the 401 challenge on the tenant host.
11
+ *
12
+ * Every lookup goes through an injectable seam (DNS, TLS) or the shared fetch, so none of this
13
+ * needs a network to test.
14
+ */
15
+ export type DnsResolver = {
16
+ resolveCname(hostname: string): Promise<string[]>;
17
+ resolveTxt(hostname: string): Promise<string[][]>;
18
+ };
19
+ export declare const systemDnsResolver: DnsResolver;
20
+ export type TlsPeer = {
21
+ authorized: boolean;
22
+ /** Why the certificate is not trusted, as Node reports it (a code such as CERT_HAS_EXPIRED). */
23
+ authorizationError?: string;
24
+ issuer: string;
25
+ subject: string;
26
+ validTo: Date;
27
+ };
28
+ export type TlsProbe = (host: string, port: number) => Promise<TlsPeer>;
29
+ /** The network seams, injectable so tests never touch DNS or open a socket. */
30
+ export type HostProbes = {
31
+ dns?: DnsResolver;
32
+ tls?: TlsProbe;
33
+ now?: () => Date;
34
+ };
35
+ export type TenantHostOptions = HostProbes & {
36
+ /** Lowercase hostname, already validated. */
37
+ host: string;
38
+ /** The receipt to compare against. Without one, records are checked for presence only. */
39
+ receipt?: RegistrationReceipt;
40
+ /**
41
+ * Why there is no receipt, as a short phrase ("no admin key to read it"), so the report says so
42
+ * instead of quietly comparing nothing.
43
+ */
44
+ receiptNote?: string;
45
+ };
46
+ export declare function runTenantHostChecks(options: TenantHostOptions): Promise<DoctorCheck[]>;
47
+ /** The certificate a server presents, whether or not Node trusts it. */
48
+ export declare const probeTls: TlsProbe;
49
+ export declare function describePeer(cert: PeerCertificate, authorized: boolean, authorizationError?: string): TlsPeer;