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.
- package/README.md +23 -3
- package/dist/brand-mark.d.ts +1 -0
- package/dist/brand-mark.js +6 -0
- package/dist/brand-mark.js.map +1 -0
- package/dist/checks.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/client-conformance.js.map +1 -1
- package/dist/commands/account.js +1 -1
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/feedback.d.ts +6 -0
- package/dist/commands/feedback.js +46 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +50 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/probe.js +9 -5
- package/dist/commands/probe.js.map +1 -1
- package/dist/commands/register.js +25 -13
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/rotate-origin-key.js +15 -10
- package/dist/commands/rotate-origin-key.js.map +1 -1
- package/dist/commands/scaffold.js +7 -4
- package/dist/commands/scaffold.js.map +1 -1
- package/dist/commands/set-domain.js.map +1 -1
- package/dist/commands/signup.js +1 -1
- package/dist/commands/signup.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.js +57 -3
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +11 -2
- package/dist/credentials.js +32 -15
- package/dist/credentials.js.map +1 -1
- package/dist/custom-domain.js.map +1 -1
- package/dist/doctor.d.ts +21 -0
- package/dist/doctor.js +76 -19
- package/dist/doctor.js.map +1 -1
- package/dist/feedback.d.ts +75 -0
- package/dist/feedback.js +82 -0
- package/dist/feedback.js.map +1 -0
- package/dist/google-redirect.js.map +1 -1
- package/dist/integration-plans.json +2 -2
- package/dist/integration.js.map +1 -1
- package/dist/login-callback.d.ts +29 -0
- package/dist/login-callback.js +79 -0
- package/dist/login-callback.js.map +1 -0
- package/dist/login.d.ts +16 -1
- package/dist/login.js +145 -99
- package/dist/login.js.map +1 -1
- package/dist/management.d.ts +12 -1
- package/dist/management.js +40 -5
- package/dist/management.js.map +1 -1
- package/dist/mcp/management-server.js +31 -10
- package/dist/mcp/management-server.js.map +1 -1
- package/dist/mcp/server.js +74 -35
- package/dist/mcp/server.js.map +1 -1
- package/dist/program.js +21 -1
- package/dist/program.js.map +1 -1
- package/dist/rail.d.ts +6 -0
- package/dist/rail.js +22 -0
- package/dist/rail.js.map +1 -1
- package/dist/secrets.d.ts +23 -5
- package/dist/secrets.js +46 -12
- package/dist/secrets.js.map +1 -1
- package/dist/surface.d.ts +1 -0
- package/dist/surface.js +1 -0
- package/dist/surface.js.map +1 -1
- package/dist/version.js.map +1 -1
- 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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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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"}
|
package/dist/management.d.ts
CHANGED
|
@@ -11,7 +11,18 @@ export declare class ManagementOperationError extends Error {
|
|
|
11
11
|
allowed_actions?: string[];
|
|
12
12
|
recovery: string;
|
|
13
13
|
};
|
|
14
|
-
|
|
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;
|
package/dist/management.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
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;
|
package/dist/management.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"management.js","sourceRoot":"","sources":["../src/management.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAU,CAAC;AAGrG,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAY,EAAE,MAAM,GAAG,KAAK,EAAE,IAAc,EAAE,KAA8B;IAClI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACrH,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,MAAM,iBAAiB,IAAI,GAAG,MAAM,EAAE,EAAE;QACjF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,UAAU,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,EAAE;QAClK,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9D,CAAC,CAAC;IACH,kFAAkF;IAClF,8EAA8E;IAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACtH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mHAAmH,CAAC,CAAC;IAClK,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC;YAAC,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC;QACvC,MAAM,CAAC;
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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() {
|