authflow-cli 0.6.0 → 0.7.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 (69) hide show
  1. package/README.md +23 -3
  2. package/dist/brand-mark.d.ts +1 -0
  3. package/dist/brand-mark.js +6 -0
  4. package/dist/brand-mark.js.map +1 -0
  5. package/dist/checks.js.map +1 -1
  6. package/dist/cli.js +2 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/client-conformance.js.map +1 -1
  9. package/dist/commands/account.js +1 -1
  10. package/dist/commands/account.js.map +1 -1
  11. package/dist/commands/feedback.d.ts +6 -0
  12. package/dist/commands/feedback.js +46 -0
  13. package/dist/commands/feedback.js.map +1 -0
  14. package/dist/commands/init.d.ts +7 -0
  15. package/dist/commands/init.js +50 -12
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/probe.js +9 -5
  18. package/dist/commands/probe.js.map +1 -1
  19. package/dist/commands/register.js +25 -13
  20. package/dist/commands/register.js.map +1 -1
  21. package/dist/commands/rotate-origin-key.js +15 -10
  22. package/dist/commands/rotate-origin-key.js.map +1 -1
  23. package/dist/commands/scaffold.js +7 -4
  24. package/dist/commands/scaffold.js.map +1 -1
  25. package/dist/commands/set-domain.js.map +1 -1
  26. package/dist/commands/signup.js +1 -1
  27. package/dist/commands/signup.js.map +1 -1
  28. package/dist/config.d.ts +12 -0
  29. package/dist/config.js +57 -3
  30. package/dist/config.js.map +1 -1
  31. package/dist/credentials.d.ts +11 -2
  32. package/dist/credentials.js +32 -15
  33. package/dist/credentials.js.map +1 -1
  34. package/dist/custom-domain.js.map +1 -1
  35. package/dist/doctor.d.ts +21 -0
  36. package/dist/doctor.js +76 -19
  37. package/dist/doctor.js.map +1 -1
  38. package/dist/feedback.d.ts +75 -0
  39. package/dist/feedback.js +82 -0
  40. package/dist/feedback.js.map +1 -0
  41. package/dist/google-redirect.js.map +1 -1
  42. package/dist/integration-plans.json +2 -2
  43. package/dist/integration.js.map +1 -1
  44. package/dist/login-callback.d.ts +29 -0
  45. package/dist/login-callback.js +79 -0
  46. package/dist/login-callback.js.map +1 -0
  47. package/dist/login.d.ts +16 -1
  48. package/dist/login.js +145 -99
  49. package/dist/login.js.map +1 -1
  50. package/dist/management.d.ts +12 -1
  51. package/dist/management.js +40 -5
  52. package/dist/management.js.map +1 -1
  53. package/dist/mcp/management-server.js +31 -10
  54. package/dist/mcp/management-server.js.map +1 -1
  55. package/dist/mcp/server.js +74 -35
  56. package/dist/mcp/server.js.map +1 -1
  57. package/dist/program.js +21 -1
  58. package/dist/program.js.map +1 -1
  59. package/dist/rail.d.ts +6 -0
  60. package/dist/rail.js +22 -0
  61. package/dist/rail.js.map +1 -1
  62. package/dist/secrets.d.ts +23 -5
  63. package/dist/secrets.js +46 -12
  64. package/dist/secrets.js.map +1 -1
  65. package/dist/surface.d.ts +1 -0
  66. package/dist/surface.js +1 -0
  67. package/dist/surface.js.map +1 -1
  68. package/dist/version.js.map +1 -1
  69. package/package.json +9 -9
package/dist/login.js CHANGED
@@ -4,10 +4,25 @@ import { spawn } from "node:child_process";
4
4
  import { once } from "node:events";
5
5
  import { z } from "zod";
6
6
  import { credentialStore } from "./credentials.js";
7
+ import { writeLoginCallback } from "./login-callback.js";
7
8
  const metadataSchema = z.object({
8
9
  issuer: z.string(), authorization_endpoint: z.string().url(), token_endpoint: z.string().url(),
9
10
  registration_endpoint: z.string().url(), revocation_endpoint: z.string().url().optional(),
11
+ authorization_response_iss_parameter_supported: z.boolean().optional(),
10
12
  });
13
+ /**
14
+ * RFC 9207 mix-up defense. An issuer that advertises the `iss` authorization-response parameter
15
+ * (Rail does) must send exactly one, matching the issuer this login started with; a response
16
+ * without it is not from that issuer's authorization endpoint. Others may omit it, but never send
17
+ * a wrong or duplicated one.
18
+ */
19
+ export function acceptsCallbackIssuer(values, issuer, required) {
20
+ if (values.length > 1)
21
+ return false;
22
+ if (values.length === 0)
23
+ return !required;
24
+ return values[0].replace(/\/+$/, "") === issuer;
25
+ }
11
26
  const tokenSchema = z.object({ access_token: z.string().min(1), refresh_token: z.string().optional(), expires_in: z.number().positive(), token_type: z.string() });
12
27
  export function validatedIssuer(value) {
13
28
  const url = new URL(value);
@@ -35,87 +50,103 @@ export function matchesOAuthState(actual, expected) {
35
50
  }
36
51
  export async function login(issuerValue, workspaceId, open = true) {
37
52
  const issuer = validatedIssuer(issuerValue);
38
- return credentialStore.withLock(issuer, async () => {
39
- const discovery = await metadata(issuer);
40
- const verifier = randomBytes(48).toString("base64url");
41
- const state = randomBytes(32).toString("base64url");
42
- const callback = createServer();
43
- callback.listen(0, "127.0.0.1");
44
- await once(callback, "listening");
45
- const address = callback.address();
46
- if (!address || typeof address === "string")
47
- throw new Error("Cannot open the loopback callback.");
48
- const redirectUri = `http://127.0.0.1:${address.port}/callback`;
49
- try {
50
- const registration = await fetch(discovery.registration_endpoint, {
51
- method: "POST", headers: { "Content-Type": "application/json" }, redirect: "error", signal: AbortSignal.timeout(15_000),
52
- body: JSON.stringify({ client_name: "Authflow CLI", application_type: "native", redirect_uris: [redirectUri], grant_types: ["authorization_code", "refresh_token"], response_types: ["code"], token_endpoint_auth_method: "none" }),
53
- });
54
- if (!registration.ok)
55
- throw new Error(`CLI registration failed (${registration.status}).`);
56
- const { client_id } = z.object({ client_id: z.string() }).parse(await registration.json());
57
- const authorize = new URL(discovery.authorization_endpoint);
58
- authorize.search = new URLSearchParams({ client_id, redirect_uri: redirectUri, response_type: "code", scope: "management:read management:write offline_access", resource: `${issuer}/management/mcp`, code_challenge: createHash("sha256").update(verifier).digest("base64url"), code_challenge_method: "S256", state, ...(workspaceId ? { workspace_id: workspaceId } : {}) }).toString();
59
- const code = new Promise((resolve, reject) => {
60
- const timeout = setTimeout(() => reject(new Error("Sign-in timed out. Run authflow login again.")), 300_000);
61
- let completed = false;
62
- callback.on("request", (request, response) => {
63
- let url;
64
- try {
65
- url = new URL(request.url ?? "/", redirectUri);
66
- }
67
- catch {
68
- response.writeHead(400).end("Invalid login callback.");
69
- return;
70
- }
71
- if (completed || request.method !== "GET" || url.origin !== new URL(redirectUri).origin || url.pathname !== "/callback"
72
- || request.headers.host !== `127.0.0.1:${address.port}` || url.searchParams.getAll("state").length !== 1
73
- || !matchesOAuthState(url.searchParams.get("state"), state)) {
74
- response.writeHead(400).end("Invalid login callback.");
75
- return;
76
- }
77
- completed = true;
78
- clearTimeout(timeout);
79
- const codeValue = url.searchParams.getAll("code").length === 1 && !url.searchParams.has("error") ? url.searchParams.get("code") : null;
80
- if (url.searchParams.getAll("iss").length > 1 || url.searchParams.get("iss") && url.searchParams.get("iss").replace(/\/+$/, "") !== issuer) {
81
- response.writeHead(400).end("Invalid issuer.");
82
- reject(new Error("Login issuer mismatch."));
83
- return;
84
- }
85
- response.writeHead(codeValue ? 200 : 400, { "Content-Type": "text/plain", "Cache-Control": "no-store" }).end(codeValue ? "Authflow sign-in finished. Return to your terminal." : "Sign-in was not completed. Return to your terminal.");
86
- if (codeValue)
87
- resolve(codeValue);
88
- else
89
- reject(new Error("Sign-in was declined or could not be completed."));
90
- });
91
- callback.on("close", () => clearTimeout(timeout));
53
+ // The browser step can take minutes. Holding the credential lock through it made every other
54
+ // CLI command and MCP call for this issuer give up after 45 s, so only the save is serialized.
55
+ const discovery = await metadata(issuer);
56
+ const verifier = randomBytes(48).toString("base64url");
57
+ const state = randomBytes(32).toString("base64url");
58
+ const callback = createServer();
59
+ callback.listen(0, "127.0.0.1");
60
+ await once(callback, "listening");
61
+ const address = callback.address();
62
+ if (!address || typeof address === "string")
63
+ throw new Error("Cannot open the loopback callback.");
64
+ const redirectUri = `http://127.0.0.1:${address.port}/callback`;
65
+ try {
66
+ const registration = await fetch(discovery.registration_endpoint, {
67
+ method: "POST", headers: { "Content-Type": "application/json" }, redirect: "error", signal: AbortSignal.timeout(15_000),
68
+ body: JSON.stringify({ client_name: "Authflow CLI", application_type: "native", redirect_uris: [redirectUri], grant_types: ["authorization_code", "refresh_token"], response_types: ["code"], token_endpoint_auth_method: "none" }),
69
+ });
70
+ if (!registration.ok)
71
+ throw new Error(`CLI registration failed (${registration.status}).`);
72
+ const { client_id } = z.object({ client_id: z.string() }).parse(await registration.json());
73
+ const authorize = new URL(discovery.authorization_endpoint);
74
+ authorize.search = new URLSearchParams({ client_id, redirect_uri: redirectUri, response_type: "code", scope: "management:read management:write offline_access", resource: `${issuer}/management/mcp`, code_challenge: createHash("sha256").update(verifier).digest("base64url"), code_challenge_method: "S256", state, ...(workspaceId ? { workspace_id: workspaceId } : {}) }).toString();
75
+ const code = new Promise((resolve, reject) => {
76
+ const timeout = setTimeout(() => reject(new Error("Sign-in timed out. Run authflow login again.")), 300_000);
77
+ let completed = false;
78
+ callback.on("request", (request, response) => {
79
+ let url;
80
+ try {
81
+ url = new URL(request.url ?? "/", redirectUri);
82
+ }
83
+ catch {
84
+ writeLoginCallback(response, "invalidCallback");
85
+ return;
86
+ }
87
+ if (completed || request.method !== "GET" || url.origin !== new URL(redirectUri).origin || url.pathname !== "/callback"
88
+ || request.headers.host !== `127.0.0.1:${address.port}` || url.searchParams.getAll("state").length !== 1
89
+ || !matchesOAuthState(url.searchParams.get("state"), state)) {
90
+ writeLoginCallback(response, "invalidCallback");
91
+ return;
92
+ }
93
+ completed = true;
94
+ clearTimeout(timeout);
95
+ const codeValue = url.searchParams.getAll("code").length === 1 && !url.searchParams.has("error") ? url.searchParams.get("code") : null;
96
+ if (!acceptsCallbackIssuer(url.searchParams.getAll("iss"), issuer, discovery.authorization_response_iss_parameter_supported === true)) {
97
+ writeLoginCallback(response, "invalidIssuer");
98
+ reject(new Error("Login issuer mismatch."));
99
+ return;
100
+ }
101
+ writeLoginCallback(response, codeValue ? "received" : "declined");
102
+ if (codeValue)
103
+ resolve(codeValue);
104
+ else
105
+ reject(new Error("Sign-in was declined or could not be completed."));
92
106
  });
93
- process.stderr.write(`Complete sign-in in your browser:\n${authorize.href}\n`);
94
- if (open)
95
- openBrowser(authorize.href);
96
- const authorizationCode = await code;
97
- const tokenResponse = await fetch(discovery.token_endpoint, { method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), body: new URLSearchParams({ grant_type: "authorization_code", client_id, redirect_uri: redirectUri, code: authorizationCode, code_verifier: verifier, resource: `${issuer}/management/mcp` }) });
98
- if (!tokenResponse.ok)
99
- throw new Error(`Sign-in token exchange failed (${tokenResponse.status}).`);
100
- const token = tokenSchema.parse(await tokenResponse.json());
101
- if (token.token_type.toLowerCase() !== "bearer")
102
- throw new Error("Unsupported token type.");
103
- // Ask Rail which workspace this credential can access; never trust an unverified JWT decode.
104
- const workspaceResponse = await fetch(`${issuer}/management/v1/workspaces`, { redirect: "error", headers: { Authorization: `Bearer ${token.access_token}` }, signal: AbortSignal.timeout(15_000) });
105
- if (!workspaceResponse.ok)
106
- throw new Error("The management credential has no accessible workspace.");
107
- const workspaces = z.array(z.object({ id: z.string() })).parse(await workspaceResponse.json());
108
- const workspace = workspaces.find(w => !workspaceId || w.id === workspaceId);
109
- if (!workspace)
110
- throw new Error("Create a workspace in the portal and run authflow login again.");
111
- await credentialStore.save({ issuer, client_id, access_token: token.access_token, refresh_token: token.refresh_token, expires_at: Date.now() + token.expires_in * 1000, workspace_id: workspace.id });
112
- return { issuer, workspace_id: workspace.id };
113
- }
114
- finally {
115
- callback.close();
116
- callback.closeAllConnections();
117
- }
118
- });
107
+ callback.on("close", () => clearTimeout(timeout));
108
+ });
109
+ process.stderr.write(`Complete sign-in in your browser:\n${authorize.href}\n`);
110
+ if (open)
111
+ openBrowser(authorize.href);
112
+ const authorizationCode = await code;
113
+ const tokenResponse = await fetch(discovery.token_endpoint, { method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), body: new URLSearchParams({ grant_type: "authorization_code", client_id, redirect_uri: redirectUri, code: authorizationCode, code_verifier: verifier, resource: `${issuer}/management/mcp` }) });
114
+ if (!tokenResponse.ok)
115
+ throw new Error(`Sign-in token exchange failed (${tokenResponse.status}).`);
116
+ const token = tokenSchema.parse(await tokenResponse.json());
117
+ if (token.token_type.toLowerCase() !== "bearer")
118
+ throw new Error("Unsupported token type.");
119
+ // Ask Rail which workspace this credential can access; never trust an unverified JWT decode.
120
+ const workspaceResponse = await fetch(`${issuer}/management/v1/workspaces`, { redirect: "error", headers: { Authorization: `Bearer ${token.access_token}` }, signal: AbortSignal.timeout(15_000) });
121
+ if (!workspaceResponse.ok)
122
+ throw new Error("The management credential has no accessible workspace.");
123
+ const workspaces = z.array(z.object({ id: z.string() })).parse(await workspaceResponse.json());
124
+ const workspace = workspaces.find(w => !workspaceId || w.id === workspaceId);
125
+ if (!workspace)
126
+ throw new Error("Create a workspace in the portal and run authflow login again.");
127
+ const credential = { issuer, client_id, access_token: token.access_token, refresh_token: token.refresh_token, expires_at: Date.now() + token.expires_in * 1000, workspace_id: workspace.id };
128
+ await credentialStore.withLock(issuer, async () => {
129
+ // An unreadable stored login is the repair case: there is nothing in it to revoke.
130
+ const previous = await credentialStore.read(issuer).catch(() => undefined);
131
+ if (previous) {
132
+ try {
133
+ await revokeLogin(issuer, previous, discovery, true);
134
+ }
135
+ catch (error) {
136
+ // Keep the earlier login, which is the only local copy of what could still revoke it, and do not
137
+ // leave the sign-in just made behind as a second live grant nothing stores.
138
+ await revokeLogin(issuer, credential, discovery).catch(() => undefined);
139
+ throw new Error(`Your previous login for this issuer could not be revoked, so it was kept and this sign-in was discarded (${error instanceof Error ? error.message : "unknown error"}) Run authflow logout, or revoke the CLI in portal account settings and then authflow logout --local-only, and sign in again.`);
140
+ }
141
+ }
142
+ await credentialStore.save(credential);
143
+ });
144
+ return { issuer, workspace_id: workspace.id };
145
+ }
146
+ finally {
147
+ callback.close();
148
+ callback.closeAllConnections();
149
+ }
119
150
  }
120
151
  export async function managementCredential(issuerValue) {
121
152
  const issuer = validatedIssuer(issuerValue);
@@ -144,33 +175,48 @@ async function renewCredential(issuer, credential) {
144
175
  }
145
176
  export async function logout(issuerValue, options = {}) {
146
177
  const issuer = validatedIssuer(issuerValue);
147
- await credentialStore.withLock(issuer, async () => {
178
+ return credentialStore.withLock(issuer, async () => {
179
+ // Local-only cleanup is also the repair path for an unreadable stored login, so it never reads it.
148
180
  if (options.localOnly) {
149
181
  await credentialStore.delete(issuer);
150
- return;
182
+ return { signed_out: true, authorization_revoked: false };
151
183
  }
152
184
  const stored = await credentialStore.read(issuer);
153
185
  if (!stored)
154
- return;
155
- // A fresh access token is necessary to revoke the durable workspace grant,
156
- // including other still-valid access tokens from this login.
157
- const credential = await renewCredential(issuer, stored).catch(() => stored);
158
- const discovery = await metadata(issuer);
159
- if (!discovery.revocation_endpoint)
160
- throw new Error("This issuer does not advertise revocation. Revoke the CLI in portal account settings before removing its login.");
161
- const grantRevocation = await fetch(`${issuer}/management/v1/authorization/revoke`, {
162
- method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), headers: { Authorization: `Bearer ${credential.access_token}` },
163
- });
164
- if (!grantRevocation.ok)
165
- throw new Error("Rail could not confirm workspace authorization revocation. Retry logout, or revoke this CLI in portal account settings and then use authflow logout --local-only to clear this device.");
166
- for (const token of [credential.refresh_token, credential.access_token].filter(Boolean)) {
167
- const response = await fetch(discovery.revocation_endpoint, { method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), body: new URLSearchParams({ client_id: credential.client_id, token: token }) });
168
- if (!response.ok)
169
- throw new Error("Rail could not revoke this login. Retry logout or revoke the CLI from portal account settings.");
170
- }
186
+ return { signed_out: false, reason: "no_login" };
187
+ await revokeLogin(issuer, stored, await metadata(issuer));
171
188
  await credentialStore.delete(issuer);
189
+ return { signed_out: true, authorization_revoked: true };
172
190
  });
173
191
  }
192
+ /**
193
+ * Revokes a stored login on the server: its durable workspace grant, then its latest refresh and
194
+ * access tokens. Logout uses it, and so does login before it replaces an earlier login, which would
195
+ * otherwise stay valid with no local copy left to revoke it.
196
+ * `replacing` tolerates an earlier login that is already unusable (it could not be renewed and its
197
+ * access token is refused), because a user re-authenticating is often doing so for exactly that reason.
198
+ */
199
+ async function revokeLogin(issuer, stored, discovery, replacing = false) {
200
+ // A fresh access token is necessary to revoke the durable workspace grant,
201
+ // including other still-valid access tokens from this login.
202
+ let renewed = true;
203
+ const credential = await renewCredential(issuer, stored).catch(() => { renewed = false; return stored; });
204
+ if (!discovery.revocation_endpoint)
205
+ throw new Error("This issuer does not advertise revocation. Revoke the CLI in portal account settings before removing its login.");
206
+ const grantRevocation = await fetch(`${issuer}/management/v1/authorization/revoke`, {
207
+ method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), headers: { Authorization: `Bearer ${credential.access_token}` },
208
+ });
209
+ if (!grantRevocation.ok) {
210
+ if (replacing && !renewed && grantRevocation.status === 401)
211
+ return;
212
+ throw new Error("Rail could not confirm workspace authorization revocation. Retry logout, or revoke this CLI in portal account settings and then use authflow logout --local-only to clear this device.");
213
+ }
214
+ for (const token of [credential.refresh_token, credential.access_token].filter(Boolean)) {
215
+ const response = await fetch(discovery.revocation_endpoint, { method: "POST", redirect: "error", signal: AbortSignal.timeout(15_000), body: new URLSearchParams({ client_id: credential.client_id, token: token }) });
216
+ if (!response.ok)
217
+ throw new Error("Rail could not revoke this login. Retry logout or revoke the CLI from portal account settings.");
218
+ }
219
+ }
174
220
  function openBrowser(url) {
175
221
  const args = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
176
222
  const executable = process.platform === "win32" ? "rundll32.exe" : process.platform === "darwin" ? "open" : "xdg-open";
package/dist/login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,18 @@ export declare class ManagementOperationError extends Error {
11
11
  allowed_actions?: string[];
12
12
  recovery: string;
13
13
  };
14
- constructor(status: number, body: unknown);
14
+ /**
15
+ * The validation message of a 400 (ProblemDetails `detail`), bounded and with URL queries removed.
16
+ * Printed by the CLI to the user's terminal; deliberately not part of `result`, which tool replies use.
17
+ */
18
+ readonly detail?: string;
19
+ constructor(status: number, body: unknown, path?: string);
15
20
  }
21
+ /**
22
+ * What the CLI prints for a failed command. A management failure carries what the user needs to
23
+ * act on (pending requirements, allowed actions, and for a 400 the validation message), which the
24
+ * one-line message alone used to drop.
25
+ */
26
+ export declare function cliErrorText(error: unknown): string;
16
27
  export declare function currentWorkspacePath(issuer: string, workspaceId?: string): Promise<string>;
17
28
  export declare function redactToolSecrets(value: unknown): unknown;
@@ -23,33 +23,68 @@ export async function managementRequest(issuer, path, method = "GET", body, quer
23
23
  result = await response.json();
24
24
  }
25
25
  catch {
26
- throw new Error(`Rail returned an unreadable management response (${response.status}). Read current resource status before explicitly retrying a mutation.`);
26
+ // Rail answers an unknown resource with a bare 404, and a request it cannot bind with a bare
27
+ // 400. Both still have a precise recovery, which an "unreadable response" would hide.
28
+ if (response.status !== 400 && response.status !== 404)
29
+ throw new Error(`Rail returned an unreadable management response (${response.status}). Read current resource status before explicitly retrying a mutation.`);
27
30
  }
28
31
  }
29
32
  if (!response.ok) {
30
33
  // Do not print arbitrary server bodies: error details may contain a sensitive return URL.
31
- throw new ManagementOperationError(response.status, result);
34
+ throw new ManagementOperationError(response.status, result, path);
32
35
  }
33
36
  return result;
34
37
  }
35
38
  /** Only machine-readable public fields may cross into an agent's error message. */
36
39
  export class ManagementOperationError extends Error {
37
40
  result;
38
- constructor(status, body) {
41
+ /**
42
+ * The validation message of a 400 (ProblemDetails `detail`), bounded and with URL queries removed.
43
+ * Printed by the CLI to the user's terminal; deliberately not part of `result`, which tool replies use.
44
+ */
45
+ detail;
46
+ constructor(status, body, path = "") {
39
47
  const details = body && typeof body === "object" ? body : {};
40
48
  const identifier = (value) => typeof value === "string" && /^[a-z0-9_]{1,80}$/.test(value);
41
49
  const code = details.error_code ?? details.error;
42
50
  const recovery = status === 400
43
51
  ? "Check the supplied arguments against the tool's documented constraints, correct invalid values, and explicitly retry. Writes are never automatically retried."
44
- : "Read the resource's current readiness, resolve its pending requirements, and explicitly retry the intended action. Writes are never automatically retried.";
52
+ : status === 404
53
+ ? path.startsWith("/docs/")
54
+ ? "No such documentation page. Find a valid path with `authflow docs search` (MCP: authflow_search_docs)."
55
+ : "Not found in this workspace. List resources with `authflow resource list` (MCP: authflow_list_resources)."
56
+ : "Read the resource's current readiness, resolve its pending requirements, and explicitly retry the intended action. Writes are never automatically retried.";
45
57
  super(`Management operation failed (${status}${identifier(code) ? `: ${code}` : ""}). ${recovery}`);
46
- this.result = { status, error_code: identifier(code) ? code : status === 400 ? "validation_failed" : "management_operation_failed", recovery };
58
+ this.result = { status, error_code: identifier(code) ? code : status === 400 ? "validation_failed" : status === 404 ? "not_found" : "management_operation_failed", recovery };
47
59
  for (const field of ["pending_requirements", "allowed_actions"]) {
48
60
  if (Array.isArray(details[field]))
49
61
  this.result[field] = details[field].filter(identifier).slice(0, 50);
50
62
  }
63
+ if (status === 400 && typeof details.detail === "string" && details.detail.trim())
64
+ this.detail = boundedDetail(details.detail);
51
65
  }
52
66
  }
67
+ const maxDetailLength = 300;
68
+ function boundedDetail(value) {
69
+ const text = value
70
+ .replace(/[\u0000-\u001f\u007f-\u009f]+/g, " ")
71
+ .replace(/\b(https?:\/\/[^\s?#]*)[?#]\S*/gi, "$1")
72
+ .replace(/\s+/g, " ")
73
+ .trim();
74
+ return text.length > maxDetailLength ? `${text.slice(0, maxDetailLength - 1)}…` : text;
75
+ }
76
+ /**
77
+ * What the CLI prints for a failed command. A management failure carries what the user needs to
78
+ * act on (pending requirements, allowed actions, and for a 400 the validation message), which the
79
+ * one-line message alone used to drop.
80
+ */
81
+ export function cliErrorText(error) {
82
+ const message = error instanceof Error ? error.message : String(error);
83
+ if (!(error instanceof ManagementOperationError))
84
+ return message;
85
+ const { recovery: _recovery, ...fields } = error.result;
86
+ return `${message}\n${JSON.stringify({ ...fields, ...(error.detail ? { detail: error.detail } : {}) }, null, 2)}`;
87
+ }
53
88
  export async function currentWorkspacePath(issuer, workspaceId) {
54
89
  const credential = await managementCredential(issuer);
55
90
  const workspace = workspaceId ?? credential.workspace_id;
@@ -1 +1 @@
1
- {"version":3,"file":"management.js","sourceRoot":"","sources":["../src/management.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"management.js","sourceRoot":"","sources":["../src/management.ts"],"names":[],"mappings":"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"}
@@ -4,22 +4,26 @@ import { z } from "zod";
4
4
  import { requireIssuer } from "../config.js";
5
5
  import { currentWorkspacePath, managementRequest, managementResourceActions, ManagementOperationError, redactToolSecrets } from "../management.js";
6
6
  import { integrationFrameworks } from "../integration.js";
7
+ import { originBaseUriProblem } from "../rail.js";
7
8
  import { cliVersion } from "../version.js";
9
+ import { feedbackBody, feedbackInputSchema, feedbackInstruction, feedbackToolDescription, feedbackToolTitle, sendWorkspaceFeedback, withFeedbackRecovery } from "../feedback.js";
8
10
  const reply = (data) => ({ content: [{ type: "text", text: JSON.stringify(redactToolSecrets(data), null, 2) }] });
9
11
  async function attempt(operation) {
10
12
  try {
11
13
  return reply(await operation());
12
14
  }
13
15
  catch (error) {
14
- if (error instanceof ManagementOperationError)
15
- return { ...reply(error.result), structuredContent: error.result, isError: true };
16
- return { content: [{ type: "text", text: error instanceof Error ? error.message : "The operation could not be completed." }], isError: true };
16
+ if (error instanceof ManagementOperationError) {
17
+ const result = { ...error.result, recovery: withFeedbackRecovery(error.result.recovery) };
18
+ return { ...reply(result), structuredContent: result, isError: true };
19
+ }
20
+ return { content: [{ type: "text", text: withFeedbackRecovery(error instanceof Error ? error.message : "The operation could not be completed.") }], isError: true };
17
21
  }
18
22
  }
19
23
  /** Local management uses the same owner/scoped HTTP operations as the hosted MCP and portal. */
20
24
  export function createManagementServer() {
21
- const server = new McpServer({ name: "authflow-management", version: cliVersion }, {
22
- instructions: "Use the workspace login stored by authflow login. Never request an admin key or OAuth token in chat. Create a draft, configure its origin and free or paid offer, retrieve its integration plan, verify, and explicitly publish. Free and gateway-metered MCPs need no origin key. Only paid origin_reported setup needs direct CLI secret-store delivery. Stripe requires the owner to complete a browser action. Use documentation search/get for details and return readiness requirements exactly as Rail reports them. Mutations are not automatically retried.",
25
+ const server = new McpServer({ name: "authflow-management", title: "Authflow workspace management", version: cliVersion, websiteUrl: "https://docs.authflow.ai/docs/tools/cli", icons: [{ src: "https://authflow.ai/brand/icon-192.png", mimeType: "image/png", sizes: ["192x192"] }] }, {
26
+ instructions: "Use the workspace login stored by authflow login. Never request an admin key or OAuth token in chat. Create a draft, configure its origin and free or paid offer, retrieve its integration plan, verify, and explicitly publish. Free and gateway-metered MCPs need no origin key. Only paid origin_reported setup needs direct CLI secret-store delivery. Stripe requires the owner to complete a browser action. Use documentation search/get for details and return readiness requirements exactly as Rail reports them. Mutations are not automatically retried." + feedbackInstruction,
23
27
  });
24
28
  const issuer = z.string().optional().describe("Authflow issuer; defaults to AUTHFLOW_ISSUER.");
25
29
  const slug = z.string().regex(/^[a-z0-9][a-z0-9-]{0,31}$/);
@@ -56,24 +60,36 @@ export function createManagementServer() {
56
60
  tool_units: z.record(z.string().min(1).max(128), meteringUnits)
57
61
  .refine(value => Object.keys(value).length <= 64, "At most 64 tools may declare a cost.").optional(),
58
62
  };
59
- const draft = { slug, display_name: z.string().min(1).max(160), access_mode: z.enum(["free", "paid"]), currency: z.string().length(3).optional(), price_amount_minor: z.number().int().nonnegative().optional(), credits_per_period: z.number().int().positive().optional(), ...metering };
63
+ // Create and update share one set of field rules; only optionality differs.
64
+ const displayName = z.string().min(1).max(160);
65
+ const currency = z.string().length(3);
66
+ const draft = { slug, display_name: displayName, access_mode: z.enum(["free", "paid"]), currency: currency.optional(), price_amount_minor: z.number().int().nonnegative().optional(), credits_per_period: z.number().int().positive().optional(), ...metering };
67
+ // Rail requires an absolute URI with no path, query or fragment: the gateway appends /mcp itself.
68
+ const originBaseUri = z.string().url().superRefine((value, context) => {
69
+ const problem = originBaseUriProblem(value);
70
+ if (problem)
71
+ context.addIssue({ code: "custom", message: problem });
72
+ });
60
73
  server.registerTool("authflow_create_resource", { title: "Create an unpublished MCP draft", description: "Creates a free or paid draft, defaulting to gateway metering. Free and gateway-metered origins need no key. Paid origin_reported integrations require direct CLI secret-store delivery. Secrets are never returned in tool messages." + meteringConstraints, inputSchema: { issuer, workspace_id, ...draft }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, ...body }) => attempt(async () => {
61
74
  const base = requireIssuer(value);
62
75
  const path = await currentWorkspacePath(base, workspace);
63
76
  const result = await managementRequest(base, `${path}/resources`, "POST", body);
64
77
  return { ...result, integration_plan: { tool: "authflow_integration_plan", arguments: { workspace_id: decodeURIComponent(path.split("/")[2]), slug: body.slug }, frameworks: [...integrationFrameworks] } };
65
78
  }));
66
- server.registerTool("authflow_update_resource", { title: "Update MCP name, offer, or metering", description: "Omitted fields are preserved. A supplied tool_units map replaces all tool overrides. Policy changes invalidate verification and publication; verify and explicitly republish." + meteringConstraints, inputSchema: { issuer, workspace_id, slug, display_name: z.string().optional(), access_mode: z.enum(["free", "paid"]).optional(), currency: z.string().optional(), price_amount_minor: z.number().int().nonnegative().optional(), credits_per_period: z.number().int().positive().optional(), ...metering }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, ...body }) => attempt(async () => {
79
+ server.registerTool("authflow_update_resource", { title: "Update MCP name, offer, or metering", description: "Omitted fields are preserved. A supplied tool_units map replaces all tool overrides. Policy changes invalidate verification and publication; verify and explicitly republish." + meteringConstraints, inputSchema: { issuer, workspace_id, slug, display_name: displayName.optional(), access_mode: z.enum(["free", "paid"]).optional(), currency: currency.optional(), price_amount_minor: z.number().int().nonnegative().optional(), credits_per_period: z.number().int().positive().optional(), ...metering }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, ...body }) => attempt(async () => {
67
80
  const base = requireIssuer(value);
68
81
  return managementRequest(base, `${await currentWorkspacePath(base, workspace)}/resources/${encodeURIComponent(resource)}`, "PATCH", body);
69
82
  }));
70
- server.registerTool("authflow_set_origin", { title: "Set the MCP origin", inputSchema: { issuer, workspace_id, slug, origin_base_uri: z.string().url() }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, origin_base_uri }) => attempt(async () => {
83
+ server.registerTool("authflow_set_origin", { title: "Set the MCP origin", description: "origin_base_uri is the private origin's scheme and host only, with no path, query, fragment or /mcp suffix: the gateway appends /mcp.", inputSchema: { issuer, workspace_id, slug, origin_base_uri: originBaseUri }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, origin_base_uri }) => attempt(async () => {
71
84
  const base = requireIssuer(value);
72
85
  return managementRequest(base, `${await currentWorkspacePath(base, workspace)}/resources/${encodeURIComponent(resource)}/origin`, "POST", { origin_base_uri });
73
86
  }));
74
- server.registerTool("authflow_set_custom_domain", { title: "Set the MCP custom hostname", inputSchema: { issuer, workspace_id, slug, public_host: z.string(), public_path: z.string().default("/mcp") }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, public_host, public_path }) => attempt(async () => {
87
+ // public_path is sent only when given: Rail uses /mcp the first time a host is set and keeps the stored
88
+ // path afterwards, so a default here would silently reset a path the creator chose. An empty host
89
+ // clears the domain, which this non-destructive tool must not do by accident.
90
+ server.registerTool("authflow_set_custom_domain", { title: "Set the MCP custom hostname", description: "Sets public_host (a subdomain you control) before first publication. public_path is optional: Rail uses /mcp the first time a host is set and keeps the stored path when it is omitted. This tool never clears a domain; to return to the slug URL, the owner runs authflow resource domain <slug> --file with {\"public_host\": null}.", inputSchema: { issuer, workspace_id, slug, public_host: z.string().trim().min(1, "public_host is required; this tool never clears a domain."), public_path: z.string().min(1).optional() }, annotations: annotations(false) }, ({ issuer: value, workspace_id: workspace, slug: resource, public_host, public_path }) => attempt(async () => {
75
91
  const base = requireIssuer(value);
76
- return managementRequest(base, `${await currentWorkspacePath(base, workspace)}/resources/${encodeURIComponent(resource)}/domain`, "POST", { public_host, public_path });
92
+ return managementRequest(base, `${await currentWorkspacePath(base, workspace)}/resources/${encodeURIComponent(resource)}/domain`, "POST", public_path === undefined ? { public_host } : { public_host, public_path });
77
93
  }));
78
94
  for (const action of managementResourceActions) {
79
95
  server.registerTool(action === "domain/refresh" ? "authflow_refresh_domain" : `authflow_${action}_resource`, { title: `${action === "publish" ? "Publish" : action === "disable" ? "Disable" : action === "verify" ? "Verify" : "Refresh domain for"} an MCP`, inputSchema: { issuer, workspace_id, slug }, annotations: annotations(false, action === "disable") }, ({ issuer: value, workspace_id: workspace, slug: resource }) => attempt(async () => {
@@ -95,6 +111,11 @@ export function createManagementServer() {
95
111
  }));
96
112
  server.registerTool("authflow_search_docs", { title: "Search Authflow documentation", inputSchema: { issuer, query: z.string().min(1).max(300), limit: z.number().int().min(1).max(25).default(8) }, annotations: annotations(true) }, ({ issuer: value, query, limit }) => attempt(() => managementRequest(requireIssuer(value), "/docs/search", "GET", undefined, { q: query, limit: String(limit) })));
97
113
  server.registerTool("authflow_get_doc", { title: "Read an Authflow documentation page or section", description: "Use a path or documentation URL returned by search. Retrieval is limited to Authflow's indexed public documentation.", inputSchema: { issuer, path: z.string().min(1).max(2048), section: z.string().max(256).optional() }, annotations: annotations(true) }, ({ issuer: value, path, section }) => attempt(() => managementRequest(requireIssuer(value), "/docs/page", "GET", undefined, { path, ...(section ? { section } : {}) })));
114
+ // Anonymous when there is no usable login: the report matters most when the login is what broke.
115
+ server.registerTool("authflow_send_feedback", { title: feedbackToolTitle, description: feedbackToolDescription, inputSchema: { issuer, workspace_id, ...feedbackInputSchema }, annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true } }, ({ issuer: value, workspace_id: workspace, ...report }) => attempt(async () => {
116
+ const base = requireIssuer(value);
117
+ return sendWorkspaceFeedback(base, feedbackBody(report, { surface: "cli_management_mcp", client: server.server.getClientVersion(), serverVersion: cliVersion }), workspace);
118
+ }));
98
119
  return server;
99
120
  }
100
121
  export async function runManagementStdioServer() {