authflow-cli 0.5.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 +84 -495
- 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.d.ts +2 -0
- package/dist/commands/account.js +105 -0
- package/dist/commands/account.js.map +1 -0
- 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/mcp.js +11 -6
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/plan.js +7 -7
- package/dist/commands/plan.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.d.ts +1 -0
- package/dist/commands/signup.js +4 -50
- package/dist/commands/signup.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.js +58 -4
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +31 -0
- package/dist/credentials.js +223 -0
- package/dist/credentials.js.map +1 -0
- 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 +80 -0
- package/dist/integration.d.ts +17 -23
- package/dist/integration.js +29 -236
- 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 +26 -0
- package/dist/login.js +227 -0
- package/dist/login.js.map +1 -0
- package/dist/management.d.ts +28 -0
- package/dist/management.js +102 -0
- package/dist/management.js.map +1 -0
- package/dist/mcp/management-server.d.ts +4 -0
- package/dist/mcp/management-server.js +124 -0
- package/dist/mcp/management-server.js.map +1 -0
- package/dist/mcp/server.js +74 -35
- package/dist/mcp/server.js.map +1 -1
- package/dist/program.js +23 -1
- package/dist/program.js.map +1 -1
- package/dist/rail.d.ts +6 -0
- package/dist/rail.js +26 -0
- package/dist/rail.js.map +1 -1
- package/dist/secrets.d.ts +51 -18
- package/dist/secrets.js +234 -89
- package/dist/secrets.js.map +1 -1
- package/dist/status.js +10 -2
- package/dist/status.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 +11 -10
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { apiJson, bearer, requireAdminKey, requireIssuer } from "../config.js";
|
|
3
3
|
import { parsePublicHost, parsePublicPath } from "../custom-domain.js";
|
|
4
|
-
import {
|
|
4
|
+
import { deliverIssuedKey, prepareLegacyOriginApiKey, secretTargets } from "../secrets.js";
|
|
5
5
|
import { formatCursorMcpConfig, formatReadiness, resourceReadiness } from "../status.js";
|
|
6
6
|
export function registerCommand(program) {
|
|
7
7
|
program
|
|
@@ -11,8 +11,8 @@ export function registerCommand(program) {
|
|
|
11
11
|
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
12
12
|
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
13
13
|
.option("-o, --out <path>", "Receipt output path", "receipt.json")
|
|
14
|
-
.option("--write-secrets <target>",
|
|
15
|
-
.option("--secret-destination <value>", "user-secrets: project dir (default .) · env-file: path (default .env.local)
|
|
14
|
+
.option("--write-secrets <target>", "Store the origin API key and redact it from the receipt (user-secrets | env-file); checked before registering")
|
|
15
|
+
.option("--secret-destination <value>", "user-secrets: project dir (default .) · env-file: path (default .env.local)")
|
|
16
16
|
.option("--keep-secret-in-receipt", "Leave the origin API key in the receipt file as plaintext (not recommended)")
|
|
17
17
|
.option("--public-host <host>", "Serve the resource on your own hostname (a subdomain) instead of the gateway's slug URL. Sent as public_host; the receipt then lists the DNS records to add")
|
|
18
18
|
.option("--public-path <path>", "Public MCP path on that host (default /mcp). Sent as public_path")
|
|
@@ -29,6 +29,9 @@ export function registerCommand(program) {
|
|
|
29
29
|
throw new Error(`--file ${opts.file} is not valid JSON.`);
|
|
30
30
|
}
|
|
31
31
|
const draft = withPublicHost(parsed, opts);
|
|
32
|
+
// The key is issued once by the POST below. Check the destination first, so an unusable one
|
|
33
|
+
// stops the command before anything exists that could be lost.
|
|
34
|
+
const prepared = target ? await prepareLegacyOriginApiKey(target, opts.secretDestination) : undefined;
|
|
32
35
|
const { body, status } = await apiJson(`${issuer}/admin/resources`, {
|
|
33
36
|
method: "POST",
|
|
34
37
|
headers: {
|
|
@@ -40,18 +43,21 @@ export function registerCommand(program) {
|
|
|
40
43
|
expectedStatuses: [201],
|
|
41
44
|
});
|
|
42
45
|
const originApiKey = typeof body.origin_api_key === "string" ? body.origin_api_key : undefined;
|
|
43
|
-
// Store the secret before the receipt is written
|
|
44
|
-
//
|
|
46
|
+
// Store the secret before the receipt is written. If that fails, the key is shown once in the
|
|
47
|
+
// terminal below: the resource exists now, and a key that is neither stored nor shown is lost.
|
|
45
48
|
let storedAt;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
let deliveryFailure;
|
|
50
|
+
if (prepared && originApiKey) {
|
|
51
|
+
const delivery = await deliverIssuedKey(prepared, originApiKey);
|
|
52
|
+
if (delivery.stored) {
|
|
53
|
+
storedAt = delivery.description;
|
|
54
|
+
body.origin_api_key = `<stored in ${storedAt}>`;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
deliveryFailure = delivery.reason;
|
|
58
|
+
}
|
|
53
59
|
}
|
|
54
|
-
|
|
60
|
+
if (!storedAt && originApiKey && (deliveryFailure !== undefined || !opts.keepSecretInReceipt)) {
|
|
55
61
|
// Redacted by default. The receipt is a file people commit, paste into issues, and hand to
|
|
56
62
|
// an agent, and the key it carried was a live bearer credential for the usage endpoint. It
|
|
57
63
|
// is printed below instead, so nothing is lost by keeping it out of the file.
|
|
@@ -71,6 +77,12 @@ export function registerCommand(program) {
|
|
|
71
77
|
if (storedAt) {
|
|
72
78
|
console.log(` origin_api_key: stored in ${storedAt} (redacted from the receipt)`);
|
|
73
79
|
}
|
|
80
|
+
else if (originApiKey && deliveryFailure !== undefined) {
|
|
81
|
+
console.error(`Registered, but storing the origin API key failed: ${deliveryFailure}`);
|
|
82
|
+
console.error("It is shown once below instead. It is not in the receipt file.");
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
console.log(` origin_api_key: ${originApiKey} (shown once — store it now)`);
|
|
85
|
+
}
|
|
74
86
|
else if (originApiKey && !opts.keepSecretInReceipt) {
|
|
75
87
|
console.log(` origin_api_key: ${originApiKey} (shown once — store it now)`);
|
|
76
88
|
console.log(" Kept out of the receipt file. Use --write-secrets to store it automatically.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAA4B,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
2
|
import { rotateOriginKey } from "../rail.js";
|
|
3
|
-
import {
|
|
3
|
+
import { deliverIssuedKey, prepareLegacyOriginApiKey, secretTargets } from "../secrets.js";
|
|
4
4
|
/**
|
|
5
5
|
* The recovery path for a lost origin API key. It existed as an MCP tool but not as a command, so a
|
|
6
6
|
* creator who lost the key — it is shown once — had no way back without an agent in the loop.
|
|
@@ -12,28 +12,33 @@ export function rotateOriginKeyCommand(program) {
|
|
|
12
12
|
.requiredOption("--slug <slug>", "Resource slug")
|
|
13
13
|
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
14
14
|
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
15
|
-
.option("--write-secrets <target>",
|
|
16
|
-
.option("--secret-destination <value>", "
|
|
15
|
+
.option("--write-secrets <target>", "Store the new key (user-secrets | env-file); checked before rotating")
|
|
16
|
+
.option("--secret-destination <value>", "user-secrets: project dir (default .) · env-file: path (default .env.local)")
|
|
17
17
|
.action(async (opts) => {
|
|
18
18
|
const auth = {
|
|
19
19
|
issuer: requireIssuer(opts.issuer),
|
|
20
20
|
adminKey: requireAdminKey(opts.adminKey),
|
|
21
21
|
};
|
|
22
|
+
// Rotation revokes the previous key the moment it returns. Check the destination first, so
|
|
23
|
+
// an unusable one stops the command while the old key still works.
|
|
22
24
|
const target = parseTarget(opts.writeSecrets);
|
|
25
|
+
const prepared = target ? await prepareLegacyOriginApiKey(target, opts.secretDestination) : undefined;
|
|
23
26
|
const receipt = await rotateOriginKey(auth, opts.slug);
|
|
24
27
|
const key = receipt.origin_api_key;
|
|
25
28
|
if (!key) {
|
|
26
29
|
throw new Error("The rail did not return a new origin API key.");
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
value: key,
|
|
32
|
-
destination: opts.secretDestination,
|
|
33
|
-
});
|
|
34
|
-
console.log(`Rotated ${opts.slug}. New key stored in ${storedAt}.`);
|
|
31
|
+
const delivery = prepared ? await deliverIssuedKey(prepared, key) : undefined;
|
|
32
|
+
if (delivery?.stored) {
|
|
33
|
+
console.log(`Rotated ${opts.slug}. New key stored in ${delivery.description}.`);
|
|
35
34
|
}
|
|
36
35
|
else {
|
|
36
|
+
if (delivery) {
|
|
37
|
+
// The old key is already revoked: losing this one would leave the origin with none.
|
|
38
|
+
console.error(`Rotated ${opts.slug}, but storing the new key failed: ${delivery.reason}`);
|
|
39
|
+
console.error("It is shown below instead. Running rotate-origin-key again would revoke it too.");
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
37
42
|
console.log(`Rotated ${opts.slug}. New origin API key (shown once):`);
|
|
38
43
|
console.log("");
|
|
39
44
|
console.log(` ${key}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rotate-origin-key.js","sourceRoot":"","sources":["../../src/commands/rotate-origin-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"rotate-origin-key.js","sourceRoot":"","sources":["../../src/commands/rotate-origin-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { writeFile } from "node:fs/promises";
|
|
2
|
-
import { readReceipt } from "../config.js";
|
|
2
|
+
import { readReceipt, saveReceiptHint } from "../config.js";
|
|
3
3
|
export function scaffoldCommand(program) {
|
|
4
4
|
program
|
|
5
5
|
.command("scaffold")
|
|
6
6
|
.description("Write .env + docker-compose snippet for authflow-origin-proxy in front of upstream")
|
|
7
|
-
.requiredOption("--receipt <path>", "
|
|
7
|
+
.requiredOption("--receipt <path>", "Receipt JSON, e.g. from authflow resource get <slug> > receipt.json")
|
|
8
8
|
.option("--upstream <url>", "Upstream MCP base URI", "http://upstream:3000")
|
|
9
9
|
.option("--env-out <path>", "Env file path", ".env")
|
|
10
10
|
.option("--compose-out <path>", "Compose file path", "docker-compose.authflow.yml")
|
|
@@ -13,9 +13,12 @@ export function scaffoldCommand(program) {
|
|
|
13
13
|
const receipt = await readReceipt(opts.receipt);
|
|
14
14
|
const issuer = receipt.issuer?.trim();
|
|
15
15
|
const resource = (receipt.resource ?? receipt.gateway_url)?.trim();
|
|
16
|
-
|
|
16
|
+
// Receipts carry "<stored in …>" or "<not written to the receipt …>" in place of a key that
|
|
17
|
+
// was kept out of the file. That marker is not a credential and must not become one in .env.
|
|
18
|
+
const recordedKey = receipt.origin_api_key?.trim();
|
|
19
|
+
const originKey = recordedKey && !recordedKey.startsWith("<") ? recordedKey : undefined;
|
|
17
20
|
if (!issuer || !resource) {
|
|
18
|
-
throw new Error(
|
|
21
|
+
throw new Error(`Receipt must include issuer and resource (or gateway_url). ${saveReceiptHint}`);
|
|
19
22
|
}
|
|
20
23
|
const envLines = [
|
|
21
24
|
`# Generated by authflow scaffold from ${opts.receipt}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oFAAoF,CAAC;SACjG,cAAc,CAAC,kBAAkB,EAAE,qEAAqE,CAAC;SACzG,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,sBAAsB,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,eAAe,EAAE,MAAM,CAAC;SACnD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,6BAA6B,CAAC;SAClF,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,CAAC;SAC7D,MAAM,CACL,KAAK,EAAE,IAMN,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;QACnE,4FAA4F;QAC5F,6FAA6F;QAC7F,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAExF,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,8DAA8D,eAAe,EAAE,CAChF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,yCAAyC,IAAI,CAAC,OAAO,EAAE;YACvD,mBAAmB,MAAM,EAAE;YAC3B,qBAAqB,QAAQ,EAAE;YAC/B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,8BAA8B,IAAI,CAAC,QAAQ,EAAE;YAC7C,EAAE;SACH,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,yCAAyC,IAAI,CAAC,OAAO;;;;;;;;;;;;;WAalE,IAAI,CAAC,SAAS;;;;;;;UAOf,IAAI,CAAC,MAAM;;;;;;;;;;;CAWpB,CAAC;QAEM,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,UAAU,eAAe,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;IACJ,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-domain.js","sourceRoot":"","sources":["../../src/commands/set-domain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC;AACxF,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAoBrD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"set-domain.js","sourceRoot":"","sources":["../../src/commands/set-domain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC;AACxF,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAoBrD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,GAAG,GAAyB,EAAE;IAC/E,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CACV,wJAAwJ,CACzJ;SACA,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC;SAChD,MAAM,CACL,eAAe,EACf,uIAAuI,CACxI;SACA,MAAM,CACL,eAAe,EACf,0IAA0I,CAC3I;SACA,MAAM,CAAC,QAAQ,EAAE,yEAAyE,CAAC;SAC3F,MAAM,CACL,qBAAqB,EACrB,mEAAmE,yBAAyB,GAAG,CAChG;SACA,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,OAAO,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAsB,EACtB,GAAG,GAAyB,EAAE;IAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEzC,6FAA6F;IAC7F,6EAA6E;IAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,gGAAgG;YAC9F,6BAA6B,CAChC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IAE9F,yEAAyE;IACzE,IAAI,OAA4B,CAAC;IACjC,IAAI,QAAgB,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,8FAA8F;QAC9F,mDAAmD;QACnD,QAAQ,GAAG,qBAAqB,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,0BAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzD,MAAM,GAAG,GACP,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,QAAQ;QAChB,WAAW,QAAQ,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAC3E,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,WAAW,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,GAAG,CACD,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,sDAAsD,cAAc,CAAC,cAAc,CAAC,gBAAgB;YACtG,CAAC,CAAC,oEAAoE,cAAc,CAAC,cAAc,CAAC,gBAAgB,CACvH,CAAC;QACF,GAAG,CAAC,KAAK,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,+EAA+E,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE;QAChD,MAAM,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;QACjD,SAAS;QACT,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACvC,CAAC,CAAC;IAEH,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrD,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvD,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAsB;IAC9C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,yBAAyB,GAAG,IAAI,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wDAAwD,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,OAA4B,EAAE,IAAY,EAAE,GAA2B;IAC1F,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,UAAU,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,cAAc,4BAA4B,CAAC,CAAC;IAErG,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED,+FAA+F;IAC/F,0BAA0B;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACrC,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;YAClC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;YACxB,GAAG,CAAC,OAAO,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,OAA4B,EAAE,IAAY,EAAE,GAA2B;IAC5F,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,wBAAwB,KAAK,KAAK,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3E,GAAG,CAAC,eAAe,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,2BAA2B,EAAE,CAAC,CAAC;IAC/F,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,+BAA+B,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CACpB,OAA4B,EAC5B,IAAY,EACZ,SAAiB,EACjB,GAA2B;IAE3B,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,SAAS,iBAAiB,CAAC,OAAO,CAAC,IAAI,SAAS,UAAU,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,KAAK,EAAE,CAAC;QACV,GAAG,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,6DAA6D,CAAC,CAAC;IACnE,GAAG,CAAC,KAAK,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/commands/signup.js
CHANGED
|
@@ -1,53 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import { signupTenant } from "../rail.js";
|
|
3
|
-
import { writeAdminApiKey } from "../secrets.js";
|
|
1
|
+
/** Compatibility command: an email address is not proof of account ownership. */
|
|
4
2
|
export function signupCommand(program) {
|
|
5
|
-
program
|
|
6
|
-
.
|
|
7
|
-
.
|
|
8
|
-
.requiredOption("--email <address>", "Email that owns the tenant")
|
|
9
|
-
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
10
|
-
.option("--write-secrets", "Write the key to an env file (default: .env.local)", true)
|
|
11
|
-
.option("--no-write-secrets", "Print the key only; do not write it to disk")
|
|
12
|
-
.option("--secret-destination <path>", "Env-file path for --write-secrets")
|
|
13
|
-
.addHelpText("after", [
|
|
14
|
-
"",
|
|
15
|
-
"The key is scoped to slugs you register with it. Paste it into Cursor as",
|
|
16
|
-
"AUTHFLOW_ADMIN_API_KEY, then run `authflow mcp` or `authflow init`.",
|
|
17
|
-
].join("\n"))
|
|
18
|
-
.action(async (opts) => {
|
|
19
|
-
const issuer = requireIssuer(opts.issuer);
|
|
20
|
-
const receipt = await signupTenant(issuer, opts.email);
|
|
21
|
-
let storedAt;
|
|
22
|
-
if (opts.writeSecrets !== false) {
|
|
23
|
-
storedAt = await writeAdminApiKey({
|
|
24
|
-
value: receipt.admin_api_key,
|
|
25
|
-
destination: opts.secretDestination,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
const mcpConfig = {
|
|
29
|
-
mcpServers: {
|
|
30
|
-
authflow: {
|
|
31
|
-
command: "npx",
|
|
32
|
-
args: ["-y", "-p", "authflow-cli", "authflow", "mcp"],
|
|
33
|
-
env: {
|
|
34
|
-
AUTHFLOW_ISSUER: receipt.issuer,
|
|
35
|
-
AUTHFLOW_ADMIN_API_KEY: storedAt ? `<from ${storedAt}>` : receipt.admin_api_key,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
process.stdout.write(JSON.stringify({
|
|
41
|
-
...receipt,
|
|
42
|
-
admin_api_key: storedAt ? `<stored in ${storedAt}>` : receipt.admin_api_key,
|
|
43
|
-
mcp_config: mcpConfig,
|
|
44
|
-
next_steps: [
|
|
45
|
-
storedAt
|
|
46
|
-
? `Load ${storedAt} (or copy the key into Cursor's MCP env) and run: npx -y -p authflow-cli authflow init --slug <your-slug>`
|
|
47
|
-
: "Store the admin_api_key, then: npx -y -p authflow-cli authflow init --slug <your-slug>",
|
|
48
|
-
"Or paste mcp_config into Cursor and let the agent finish onboarding.",
|
|
49
|
-
],
|
|
50
|
-
}, null, 2) + "\n");
|
|
51
|
-
});
|
|
3
|
+
program.command("signup").description("Moved: use verified browser sign-in with authflow login")
|
|
4
|
+
.option("--email <address>").option("--issuer <url>").option("--write-secrets").option("--no-write-secrets").option("--secret-destination <path>")
|
|
5
|
+
.action(() => { throw new Error("Email-only signup has been retired. Run authflow login --issuer <issuer>: its first browser authorization creates your workspace. Existing tenant owners can claim their workspace in the portal with their current admin credential."); });
|
|
52
6
|
}
|
|
53
7
|
//# sourceMappingURL=signup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yDAAyD,CAAC;SAC7F,MAAM,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC;SACjJ,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uOAAuO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjR,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -54,20 +54,36 @@ export type RegistrationReceipt = {
|
|
|
54
54
|
origin_api_key?: string;
|
|
55
55
|
gateway_egress_cidrs?: string[];
|
|
56
56
|
status?: string;
|
|
57
|
+
access_mode?: "free" | "paid";
|
|
57
58
|
metering_mode?: string;
|
|
59
|
+
metering_default_units?: number;
|
|
60
|
+
tool_units?: Record<string, number>;
|
|
58
61
|
/**
|
|
59
62
|
* What still blocks go-live: origin_base_uri, connected_account_id, stripe_onboarding_complete,
|
|
60
63
|
* and custom_domain_dns while a custom host is set but not yet ready.
|
|
61
64
|
*/
|
|
62
65
|
pending_requirements?: string[];
|
|
66
|
+
allowed_actions?: string[];
|
|
63
67
|
last_probe_at_utc?: string | null;
|
|
64
68
|
last_probe_passed?: boolean | null;
|
|
65
69
|
};
|
|
70
|
+
export declare const saveReceiptHint = "Save it with: authflow resource get <slug> > receipt.json";
|
|
71
|
+
/**
|
|
72
|
+
* Reads a receipt saved by `authflow resource get <slug> > receipt.json`, which prints
|
|
73
|
+
* `{ "result": receipt }`, or the bare receipt legacy `authflow register` writes. Windows
|
|
74
|
+
* PowerShell 5.1 redirects as UTF-16LE with a byte-order mark, so that encoding is accepted too.
|
|
75
|
+
*/
|
|
66
76
|
export declare function readReceipt(path: string): Promise<RegistrationReceipt>;
|
|
67
77
|
export declare function resolveGatewayUrl(opts: {
|
|
68
78
|
gatewayUrl?: string;
|
|
69
79
|
receipt?: RegistrationReceipt;
|
|
70
80
|
}): string | undefined;
|
|
81
|
+
export declare const apiTimeoutMs = 30000;
|
|
82
|
+
/**
|
|
83
|
+
* The legacy admin and Origin Protocol calls. They carry admin or origin bearer keys, so a redirect
|
|
84
|
+
* is refused rather than followed (the management path does the same), a hung rail cannot hang the
|
|
85
|
+
* CLI, and a network failure names the host and the cause instead of a bare "fetch failed".
|
|
86
|
+
*/
|
|
71
87
|
export declare function apiJson<T>(url: string, init?: RequestInit & {
|
|
72
88
|
expectedStatuses?: number[];
|
|
73
89
|
}): Promise<{
|
package/dist/config.js
CHANGED
|
@@ -9,7 +9,7 @@ export function requireIssuer(flag) {
|
|
|
9
9
|
export function requireAdminKey(flag) {
|
|
10
10
|
const key = (flag ?? process.env.AUTHFLOW_ADMIN_API_KEY ?? "").trim();
|
|
11
11
|
if (!key) {
|
|
12
|
-
throw new Error("
|
|
12
|
+
throw new Error("This legacy operator command requires AUTHFLOW_ADMIN_API_KEY or --admin-key. For creator onboarding, run authflow login and use authflow resource commands. Claim an existing workspace in the portal with its current tenant key.");
|
|
13
13
|
}
|
|
14
14
|
return key;
|
|
15
15
|
}
|
|
@@ -20,9 +20,32 @@ export function requireOriginKey(flag) {
|
|
|
20
20
|
}
|
|
21
21
|
return key;
|
|
22
22
|
}
|
|
23
|
+
export const saveReceiptHint = "Save it with: authflow resource get <slug> > receipt.json";
|
|
24
|
+
/**
|
|
25
|
+
* Reads a receipt saved by `authflow resource get <slug> > receipt.json`, which prints
|
|
26
|
+
* `{ "result": receipt }`, or the bare receipt legacy `authflow register` writes. Windows
|
|
27
|
+
* PowerShell 5.1 redirects as UTF-16LE with a byte-order mark, so that encoding is accepted too.
|
|
28
|
+
*/
|
|
23
29
|
export async function readReceipt(path) {
|
|
24
|
-
const
|
|
25
|
-
|
|
30
|
+
const bytes = await readFile(path);
|
|
31
|
+
const raw = bytes[0] === 0xff && bytes[1] === 0xfe
|
|
32
|
+
? bytes.subarray(2).toString("utf16le")
|
|
33
|
+
: bytes.toString("utf8").replace(/^\uFEFF/, "");
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(raw);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error(`${path} is not a JSON receipt. ${saveReceiptHint}`);
|
|
40
|
+
}
|
|
41
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
42
|
+
throw new Error(`${path} is not a JSON receipt. ${saveReceiptHint}`);
|
|
43
|
+
}
|
|
44
|
+
const wrapped = parsed.result;
|
|
45
|
+
if (wrapped && typeof wrapped === "object" && !Array.isArray(wrapped) && !("issuer" in parsed)) {
|
|
46
|
+
return wrapped;
|
|
47
|
+
}
|
|
48
|
+
return parsed;
|
|
26
49
|
}
|
|
27
50
|
export function resolveGatewayUrl(opts) {
|
|
28
51
|
return (opts.gatewayUrl?.trim() ||
|
|
@@ -32,9 +55,21 @@ export function resolveGatewayUrl(opts) {
|
|
|
32
55
|
opts.receipt?.resource?.trim() ||
|
|
33
56
|
undefined);
|
|
34
57
|
}
|
|
58
|
+
export const apiTimeoutMs = 30_000;
|
|
59
|
+
/**
|
|
60
|
+
* The legacy admin and Origin Protocol calls. They carry admin or origin bearer keys, so a redirect
|
|
61
|
+
* is refused rather than followed (the management path does the same), a hung rail cannot hang the
|
|
62
|
+
* CLI, and a network failure names the host and the cause instead of a bare "fetch failed".
|
|
63
|
+
*/
|
|
35
64
|
export async function apiJson(url, init = {}) {
|
|
36
65
|
const { expectedStatuses, ...fetchInit } = init;
|
|
37
|
-
|
|
66
|
+
let response;
|
|
67
|
+
try {
|
|
68
|
+
response = await fetch(url, { redirect: "error", signal: AbortSignal.timeout(apiTimeoutMs), ...fetchInit });
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new Error(`Request to ${hostOf(url)} failed: ${networkFailure(error)}. Check the issuer URL and your network.`, { cause: error });
|
|
72
|
+
}
|
|
38
73
|
const raw = await response.text();
|
|
39
74
|
let body;
|
|
40
75
|
try {
|
|
@@ -50,6 +85,25 @@ export async function apiJson(url, init = {}) {
|
|
|
50
85
|
}
|
|
51
86
|
return { status: response.status, body, raw };
|
|
52
87
|
}
|
|
88
|
+
function hostOf(url) {
|
|
89
|
+
try {
|
|
90
|
+
return new URL(url).host;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return url;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function networkFailure(error) {
|
|
97
|
+
if (error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError")) {
|
|
98
|
+
return `no response within ${apiTimeoutMs / 1000} seconds`;
|
|
99
|
+
}
|
|
100
|
+
const cause = error instanceof Error ? error.cause : undefined;
|
|
101
|
+
const detail = [cause?.code, cause?.message].find((value) => typeof value === "string" && value.length > 0)
|
|
102
|
+
?? (error instanceof Error ? error.message : String(error));
|
|
103
|
+
return /redirect/i.test(detail)
|
|
104
|
+
? "the server answered with a redirect, which is never followed while sending a key; use the canonical issuer URL"
|
|
105
|
+
: detail;
|
|
106
|
+
}
|
|
53
107
|
export function bearer(token) {
|
|
54
108
|
return { Authorization: `Bearer ${token}` };
|
|
55
109
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAU5C,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type LoginCredential = {
|
|
2
|
+
issuer: string;
|
|
3
|
+
client_id: string;
|
|
4
|
+
access_token: string;
|
|
5
|
+
refresh_token?: string;
|
|
6
|
+
expires_at: number;
|
|
7
|
+
workspace_id: string;
|
|
8
|
+
};
|
|
9
|
+
export type KeyringEntry = {
|
|
10
|
+
getPassword(): string | null;
|
|
11
|
+
setPassword(value: string): void;
|
|
12
|
+
deletePassword(): boolean;
|
|
13
|
+
};
|
|
14
|
+
/** The native OS keyring. One object so tests can replace it without touching the real store. */
|
|
15
|
+
export declare const keyring: {
|
|
16
|
+
open(account: string): Promise<KeyringEntry>;
|
|
17
|
+
};
|
|
18
|
+
/** Credentials never enter the checkout, environment files, or tool results. */
|
|
19
|
+
export declare function credentialEntry(issuer: string, suffix?: string): Promise<KeyringEntry>;
|
|
20
|
+
export declare function readCredential(issuer: string): Promise<LoginCredential | undefined>;
|
|
21
|
+
export declare function saveCredential(credential: LoginCredential): Promise<void>;
|
|
22
|
+
export declare function deleteCredential(issuer: string): Promise<void>;
|
|
23
|
+
/** Serialize refresh-token rotation across CLI/MCP processes. The lock contains no secrets. */
|
|
24
|
+
export declare function withCredentialLock<T>(issuer: string, action: () => Promise<T>, directory?: string): Promise<T>;
|
|
25
|
+
/** One storage boundary also lets protocol tests use an isolated in-memory credential store. */
|
|
26
|
+
export declare const credentialStore: {
|
|
27
|
+
read: typeof readCredential;
|
|
28
|
+
save: typeof saveCredential;
|
|
29
|
+
delete: typeof deleteCredential;
|
|
30
|
+
withLock: typeof withCredentialLock;
|
|
31
|
+
};
|