@ai21/gateway 0.5.3 → 0.5.4

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 CHANGED
@@ -24,16 +24,30 @@ agent) and offers the key as a separate copy.
24
24
  `configure` is accepted as an alias for `install`: it was the verb's name through
25
25
  0.3.x, so commands copied from an older dashboard keep working.
26
26
 
27
- There is a third verb, `login`, which signs in through the browser and then
28
- installs. It parses and runs but is **left out of `--help`**: it calls back to a
29
- loopback listener, which only works from a locally served dashboard — Chrome's
30
- Local Network Access gate makes a public page's request to `127.0.0.1` hang. Until
31
- that has a real answer it is a local-dev path, and advertising it would send
32
- readers into a dead end. `--app <url>` points it at a local webapp.
27
+ There is a third verb, `login`, which signs in through the browser and stores the
28
+ session. It parses and runs but is **left out of `--help`**, because nothing spends
29
+ that session yet: after signing in you still configure a repo with
30
+ `install --agent-id … --key …`, so advertising it would promise a shortcut that is
31
+ not there. Agent creation from a stored session is what makes it worth showing.
32
+
33
+ The loopback callback itself does work from a deployed dashboard. Chrome gates a
34
+ public page's `fetch` to `127.0.0.1` behind Local Network Access and Safari refuses
35
+ it outright, so the consent screen falls back to a top-level form POST — a
36
+ navigation, so no CORS, no preflight and no mixed-content rule, with the credential
37
+ still in the request body. The listener accepts JSON and form encodings alike and
38
+ checks the same nonce either way (`src/login/loopback.ts`, and
39
+ `src/auth/deliverCliCredential.ts` in the webapp).
40
+
41
+ `--app <url>` points login at a webapp the gateway host does not name — a local one,
42
+ most often.
33
43
 
34
44
  The gateway defaults to `https://api.ai21.com/gateway`. `--gateway <url>` points
35
45
  somewhere else — staging is `https://api.ai21-stg.com/gateway`, and the dashboard
36
- puts it in the command it prints for you.
46
+ puts it in the command it prints for you. The webapp follows it: `login` derives
47
+ the consent screen's origin from the gateway host (`api.` → `app.`), so a staging
48
+ gateway signs in against the staging dashboard rather than production. Off that
49
+ convention — localhost, or any host not starting `api.` — there is nothing to
50
+ derive, so `login` asks for `--app <url>` instead of guessing.
37
51
 
38
52
  `--print` renders the config instead of writing it, with the key masked. `--help`
39
53
  lists the rest.
package/dist/args.d.ts CHANGED
@@ -15,12 +15,21 @@ export interface ResolvedUrls {
15
15
  readonly agents: string;
16
16
  }
17
17
  /**
18
- * `--gateway` overrides only the gateway itself — the escape hatch for a local
19
- * or dev backend. `agents` is always derived from whichever gateway won, so an
20
- * override stays internally consistent.
18
+ * The webapp origin for a gateway, by the `api.` → `app.` convention every deployed
19
+ * environment follows. Undefined off it (localhost, a bare hostname) — those pass `--app`
20
+ * rather than be guessed at.
21
+ */
22
+ export declare function appOriginFor(gatewayUrl: string): string | undefined;
23
+ /**
24
+ * `--gateway` moves the gateway and what derives from it: `agents` by path, `app` by the
25
+ * convention above. `--app` overrides that derivation.
26
+ *
27
+ * `identity` stays on its default because nothing reads it — see login/workspaces.ts.
21
28
  */
22
29
  export declare function resolveUrls(gatewayOverride?: string, appOverride?: string): ResolvedUrls;
23
- /** The workspace dashboard, built from the baked-in origin rather than a given URL. */
30
+ /** The workspace dashboard, built from the resolved origin rather than a given URL.
31
+ * No caller since `login` stopped printing a dashboard link; kept for the verb that
32
+ * reads the stored session. */
24
33
  export declare function dashboardUrl(urls: ResolvedUrls, workspaceId: string): string;
25
34
  /** Which coding agent's config to write. Only Claude Code is implemented; the flag
26
35
  * exists so the choice is explicit at the boundary rather than assumed throughout. */
package/dist/args.js CHANGED
@@ -17,23 +17,46 @@ export const DEFAULT_URLS = {
17
17
  identity: "https://api.ai21.com",
18
18
  };
19
19
  /**
20
- * `--gateway` overrides only the gateway itself — the escape hatch for a local
21
- * or dev backend. `agents` is always derived from whichever gateway won, so an
22
- * override stays internally consistent.
20
+ * The webapp origin for a gateway, by the `api.` → `app.` convention every deployed
21
+ * environment follows. Undefined off it (localhost, a bare hostname) — those pass `--app`
22
+ * rather than be guessed at.
23
+ */
24
+ export function appOriginFor(gatewayUrl) {
25
+ let parsed;
26
+ try {
27
+ parsed = new URL(gatewayUrl);
28
+ }
29
+ catch {
30
+ return undefined;
31
+ }
32
+ if (!parsed.hostname.startsWith("api."))
33
+ return undefined;
34
+ // Rebuilt from parts, so a port survives and a path cannot.
35
+ const host = `app.${parsed.hostname.slice("api.".length)}`;
36
+ return `${parsed.protocol}//${host}${parsed.port === "" ? "" : `:${parsed.port}`}`;
37
+ }
38
+ /**
39
+ * `--gateway` moves the gateway and what derives from it: `agents` by path, `app` by the
40
+ * convention above. `--app` overrides that derivation.
41
+ *
42
+ * `identity` stays on its default because nothing reads it — see login/workspaces.ts.
23
43
  */
24
44
  export function resolveUrls(gatewayOverride, appOverride) {
25
45
  const base = DEFAULT_URLS;
26
46
  // Trailing slashes are stripped so appending a path can't produce `//`, which
27
47
  // some gateways treat as a different route than the one intended.
28
48
  const gateway = (gatewayOverride ?? base.gateway).replace(/\/+$/, "");
49
+ const derivedApp = gatewayOverride === undefined ? undefined : appOriginFor(gateway);
29
50
  return {
30
- app: (appOverride ?? base.app).replace(/\/+$/, ""),
51
+ app: (appOverride ?? derivedApp ?? base.app).replace(/\/+$/, ""),
31
52
  gateway,
32
53
  identity: base.identity,
33
54
  agents: `${gateway}/settings/agents`,
34
55
  };
35
56
  }
36
- /** The workspace dashboard, built from the baked-in origin rather than a given URL. */
57
+ /** The workspace dashboard, built from the resolved origin rather than a given URL.
58
+ * No caller since `login` stopped printing a dashboard link; kept for the verb that
59
+ * reads the stored session. */
37
60
  export function dashboardUrl(urls, workspaceId) {
38
61
  return `${urls.app}/w/${encodeURIComponent(workspaceId)}`;
39
62
  }
@@ -42,9 +65,8 @@ export function dashboardUrl(urls, workspaceId) {
42
65
  export const CLIENTS = ["claude-code"];
43
66
  export const DEFAULT_CLIENT = "claude-code";
44
67
  export const VERBS = ["install", "login", "uninstall"];
45
- /* What --help and the usage errors name. `login` is accepted but not advertised: it
46
- * needs a webapp that answers its loopback callback, which is a local-dev-only setup
47
- * today, so offering it to everyone reading --help only invites a dead end. */
68
+ /* `login` is accepted but not advertised: nothing spends the session it stores yet, so
69
+ * the reader would still have to `install --agent-id … --key …` afterwards. */
48
70
  export const DOCUMENTED_VERBS = ["install", "uninstall"];
49
71
  /** `configure` was this verb's name through 0.3.x, and the dashboard printed it. Still
50
72
  * accepted so a copied command keeps working; deliberately absent from help. (`setup`
@@ -67,11 +89,11 @@ const ALLOWED_FLAGS = {
67
89
  "anthropic-key",
68
90
  "no-verify",
69
91
  ],
70
- // `login` ends in the same write-then-verify as `install`, so it takes the
71
- // same verification flags.
72
- // `--app` is the webapp counterpart of `--gateway`: the escape hatch for running
73
- // `login` against a locally served webapp, which is the only way to develop the
74
- // cross-repo handshake end to end.
92
+ /* `--app` names the webapp when the gateway host does not (see appOriginFor).
93
+ * `--print`, `--client`, `--repo`, `--user`, `--anthropic-key` and `--no-verify` are all
94
+ * dead here since login stopped writing and verifying — `--print` still renders a
95
+ * settings.json this verb never writes. Worth removing together with the verb's next
96
+ * change, rather than one at a time. */
75
97
  login: ["gateway", "app", "client", "repo", "user", "print", "json", "anthropic-key", "no-verify"],
76
98
  // `uninstall` needs --repo/--user for the same reason `install` does: it has to
77
99
  // revert whichever settings.json was written, and a --user config would
@@ -270,6 +292,11 @@ export function parseCliArgs(argv) {
270
292
  if (values.app !== undefined && verb !== "login") {
271
293
  return fail("--app only applies to 'login', the flow a browser takes part in.");
272
294
  }
295
+ /* Defaulting to production here would sign in against a different environment than the
296
+ * gateway names. */
297
+ if (verb === "login" && gateway !== undefined && app === undefined && appOriginFor(gateway) === undefined) {
298
+ return fail(`Cannot tell which webapp serves '${gateway}'. Pass --app <url> with the webapp's origin.`);
299
+ }
273
300
  const strandedVerifyFlags = VERIFY_FLAGS.filter((flag) => values.print === true && values[flag] !== undefined);
274
301
  if (strandedVerifyFlags.length > 0) {
275
302
  return fail(`${strandedVerifyFlags.map((flag) => `--${flag}`).join(", ")} ` +
package/dist/args.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -110,6 +110,7 @@ export async function run(argv) {
110
110
  login: {
111
111
  startListener: startLoopback,
112
112
  openBrowser: (url) => openBrowser(url, nodeBrowserDeps()),
113
+ fetchImpl: fetch,
113
114
  },
114
115
  // stderr, so `--json` on stdout stays a single parseable object even while
115
116
  // login narrates its progress.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,42 @@
1
1
  /**
2
- * The interface between this CLI and the gateway webapp: the CLI opens
3
- * `{app}/welcome` with a callback URL and a `state` nonce, the user signs in, and the
4
- * page POSTs the credentials back to the loopback listener.
5
- *
6
- * The webapp half lives in ai21-intelligent-gateway-webapp
7
- * (src/pages/welcome/cliHandoff.ts); this file is the only place either side's shape
8
- * is defined, so a change to the agreement is a change to this module.
9
- *
10
- * Three properties are what make it safe rather than merely convenient: the secret
11
- * arrives in a POST body and never a URL; `state` is compared before anything is
12
- * written; and the listener is loopback-only.
2
+ * The interface between this CLI and the webapp's `/cli-login` consent screen
3
+ * (`src/auth/cliLoginRequest.ts`). Shared by name and not by schema, so renaming a
4
+ * field here breaks sign-in with nothing failing on the other side.
13
5
  */
14
- /** Query parameters the CLI adds to the `/welcome` URL it opens. */
15
- export declare const CALLBACK_PARAM = "cli_callback";
6
+ /** Query parameters on the `/cli-login` URL. */
7
+ export declare const REDIRECT_PARAM = "redirect_uri";
16
8
  export declare const STATE_PARAM = "state";
17
- /** Path the listener answers on. Only this path, and only POST (plus preflight). */
18
- export declare const CALLBACK_PATH = "/cli-callback";
19
- /**
20
- * Opened first, and redirects to `/welcome`, so the nonce stays out of the browser's
21
- * argv where other local users could read it.
22
- *
23
- * A mitigation, not a cure — it still reaches the URL bar and history, and a local
24
- * attacker who guesses the port can request `/start`. Hence single-use: losing that
25
- * race breaks the sign-in visibly rather than quietly.
26
- */
27
- export declare const START_PATH = "/start";
28
- /** What the webapp is expected to POST as JSON. */
29
- export interface CliCallback {
30
- readonly state: string;
31
- readonly ai21Key: string;
32
- readonly agentId: string;
33
- /** Drives the dashboard link; the webapp routes on `/w/:workspaceId`. Optional. */
9
+ export declare const CODE_PARAM = "code";
10
+ export declare const EXPIRES_PARAM = "exp";
11
+ export declare const CLIENT_PARAM = "client";
12
+ /** Names this CLI to the consent screen. */
13
+ export declare const CLIENT_ID = "gateway";
14
+ /** Path the listener answers on. */
15
+ export declare const CALLBACK_PATH = "/callback";
16
+ /** The consent screen's page path. */
17
+ export declare const CLI_LOGIN_PATH = "/cli-login";
18
+ /** What the consent screen POSTs on approval. */
19
+ export interface CliCredential {
20
+ readonly refreshToken: string;
21
+ readonly firebaseApiKey: string;
22
+ readonly projectId: string;
23
+ readonly userId: string;
24
+ readonly userEmail: string;
25
+ /** Which workspace the user was in when they consented. Advisory. */
34
26
  readonly workspaceId?: string;
35
27
  }
28
+ /** Approval, or the page reporting the user pressed Deny. */
29
+ export type CallbackOutcome = {
30
+ readonly kind: "credential";
31
+ readonly credential: CliCredential;
32
+ } | {
33
+ readonly kind: "declined";
34
+ readonly reason: string;
35
+ };
36
36
  export declare function isWorkspaceId(value: unknown): value is string;
37
37
  /**
38
- * Reads an untrusted JSON body into the contract shape. Strict by design: this is
39
- * remote input, so a missing or non-string field is a rejection, not a coercion.
40
- * Values are validated separately, by the rule the flags use.
38
+ * Reads an untrusted JSON or form body into the contract shape; a missing or non-string
39
+ * field is a rejection, not a coercion. `state` is the caller's to compare, not ours.
41
40
  */
42
- export declare function parseCallback(body: unknown): CliCallback | undefined;
41
+ export declare function parseCallback(body: unknown): CallbackOutcome | undefined;
42
+ export declare function verificationCode(randomInt: (max: number) => number): string;
@@ -1,60 +1,73 @@
1
1
  /**
2
- * The interface between this CLI and the gateway webapp: the CLI opens
3
- * `{app}/welcome` with a callback URL and a `state` nonce, the user signs in, and the
4
- * page POSTs the credentials back to the loopback listener.
5
- *
6
- * The webapp half lives in ai21-intelligent-gateway-webapp
7
- * (src/pages/welcome/cliHandoff.ts); this file is the only place either side's shape
8
- * is defined, so a change to the agreement is a change to this module.
9
- *
10
- * Three properties are what make it safe rather than merely convenient: the secret
11
- * arrives in a POST body and never a URL; `state` is compared before anything is
12
- * written; and the listener is loopback-only.
2
+ * The interface between this CLI and the webapp's `/cli-login` consent screen
3
+ * (`src/auth/cliLoginRequest.ts`). Shared by name and not by schema, so renaming a
4
+ * field here breaks sign-in with nothing failing on the other side.
13
5
  */
14
- /** Query parameters the CLI adds to the `/welcome` URL it opens. */
15
- export const CALLBACK_PARAM = "cli_callback";
6
+ /** Query parameters on the `/cli-login` URL. */
7
+ export const REDIRECT_PARAM = "redirect_uri";
16
8
  export const STATE_PARAM = "state";
17
- /** Path the listener answers on. Only this path, and only POST (plus preflight). */
18
- export const CALLBACK_PATH = "/cli-callback";
19
- /**
20
- * Opened first, and redirects to `/welcome`, so the nonce stays out of the browser's
21
- * argv where other local users could read it.
22
- *
23
- * A mitigation, not a cure — it still reaches the URL bar and history, and a local
24
- * attacker who guesses the port can request `/start`. Hence single-use: losing that
25
- * race breaks the sign-in visibly rather than quietly.
26
- */
27
- export const START_PATH = "/start";
28
- /**
29
- * An id, never a URL: the dashboard link is built from the baked-in origin, so a
30
- * callback cannot choose where the browser lands. No `/`, `:` or `%` means an id
31
- * cannot escape its path segment. Not a UUID check — that would be a guessed format,
32
- * and the property needed is only "cannot escape".
33
- */
9
+ export const CODE_PARAM = "code";
10
+ export const EXPIRES_PARAM = "exp";
11
+ export const CLIENT_PARAM = "client";
12
+ /** Names this CLI to the consent screen. */
13
+ export const CLIENT_ID = "gateway";
14
+ /** Path the listener answers on. */
15
+ export const CALLBACK_PATH = "/callback";
16
+ /** The consent screen's page path. */
17
+ export const CLI_LOGIN_PATH = "/cli-login";
18
+ /** An id, never a URL: it goes in a path segment and must not be able to escape it. */
34
19
  const SAFE_ID = /^[A-Za-z0-9._-]{1,64}$/;
35
20
  export function isWorkspaceId(value) {
36
21
  return typeof value === "string" && SAFE_ID.test(value) && value !== "." && value !== "..";
37
22
  }
23
+ /** The snake_case wire names. */
24
+ const REQUIRED = ["refresh_token", "firebase_api_key", "project_id", "user_id", "user_email"];
25
+ // C0 controls plus DEL, matching args.ts. These strings reach a terminal, where an ANSI
26
+ // escape or a carriage return rewrites what the user sees — stripped here so that no
27
+ // consumer has to remember to.
28
+ // eslint-disable-next-line no-control-regex
29
+ const CONTROL_CHARS = /[\u0000-\u001F\u007F]/g;
30
+ function readString(source, key) {
31
+ const value = source[key];
32
+ if (typeof value !== "string")
33
+ return undefined;
34
+ const plain = value.replace(CONTROL_CHARS, "");
35
+ return plain === "" ? undefined : plain;
36
+ }
38
37
  /**
39
- * Reads an untrusted JSON body into the contract shape. Strict by design: this is
40
- * remote input, so a missing or non-string field is a rejection, not a coercion.
41
- * Values are validated separately, by the rule the flags use.
38
+ * Reads an untrusted JSON or form body into the contract shape; a missing or non-string
39
+ * field is a rejection, not a coercion. `state` is the caller's to compare, not ours.
42
40
  */
43
41
  export function parseCallback(body) {
44
42
  if (typeof body !== "object" || body === null || Array.isArray(body))
45
43
  return undefined;
46
- const { state, ai21Key, agentId, workspaceId } = body;
47
- if (typeof state !== "string" || typeof ai21Key !== "string" || typeof agentId !== "string")
48
- return undefined;
49
- if (state === "" || ai21Key === "" || agentId === "")
44
+ const source = body;
45
+ // The page posts `error` on decline, so the CLI exits rather than waiting out its deadline.
46
+ const error = readString(source, "error");
47
+ if (error !== undefined) {
48
+ return { kind: "declined", reason: error.slice(0, 200) };
49
+ }
50
+ if (REQUIRED.some((key) => readString(source, key) === undefined))
50
51
  return undefined;
52
+ const workspaceId = source["workspace_id"];
51
53
  return {
52
- state,
53
- ai21Key,
54
- agentId,
55
- // Dropped rather than rejected when malformed: the dashboard redirect is a
56
- // convenience, and losing it must not fail an otherwise good sign-in.
57
- ...(isWorkspaceId(workspaceId) ? { workspaceId } : {}),
54
+ kind: "credential",
55
+ credential: {
56
+ refreshToken: readString(source, "refresh_token"),
57
+ firebaseApiKey: readString(source, "firebase_api_key"),
58
+ projectId: readString(source, "project_id"),
59
+ userId: readString(source, "user_id"),
60
+ userEmail: readString(source, "user_email"),
61
+ // Dropped rather than rejected: it is advisory, and must not fail a good sign-in.
62
+ ...(isWorkspaceId(workspaceId) ? { workspaceId } : {}),
63
+ },
58
64
  };
59
65
  }
66
+ /** No look-alikes: the user reads this off a screen. The shape must match `CODE_RE`
67
+ * in cliLoginRequest.ts, which refuses anything else. */
68
+ const CODE_ALPHABET = "ABCDEFGHJKMNPQRSTUVWXYZ23456789";
69
+ export function verificationCode(randomInt) {
70
+ const group = () => Array.from({ length: 4 }, () => CODE_ALPHABET[randomInt(CODE_ALPHABET.length)]).join("");
71
+ return `${group()}-${group()}`;
72
+ }
60
73
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/login/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAWnC;;;;;GAKG;AACH,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAA+B,CAAC;IACjF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE9G,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEvE,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;QACP,2EAA2E;QAC3E,sEAAsE;QACtE,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/login/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface StoredCredential {
2
+ readonly refreshToken: string;
3
+ readonly firebaseApiKey: string;
4
+ readonly projectId: string;
5
+ readonly userId: string;
6
+ readonly userEmail: string;
7
+ readonly workspaceId?: string | undefined;
8
+ /** ISO 8601, for `whoami` to say how old the session is. */
9
+ readonly obtainedAt: string;
10
+ }
11
+ /** Injected so tests never touch a real home directory. */
12
+ export interface CredentialPaths {
13
+ readonly home: string;
14
+ }
15
+ export declare function credentialsPath(ctx: CredentialPaths): string;
16
+ export type LoadOutcome = {
17
+ readonly kind: "none";
18
+ } | {
19
+ readonly kind: "credential";
20
+ readonly credential: StoredCredential;
21
+ }
22
+ /** The file exists but cannot be trusted or read — the message says what to do. */
23
+ | {
24
+ readonly kind: "unusable";
25
+ readonly reason: string;
26
+ };
27
+ export declare function load(gateway: string, ctx: CredentialPaths): LoadOutcome;
28
+ /**
29
+ * Writes one gateway's credential, leaving the others alone. Created at 0600 rather than
30
+ * chmodded after: the gap between the two is openable by another local user.
31
+ */
32
+ export declare function save(gateway: string, credential: StoredCredential, ctx: CredentialPaths): void;
33
+ /** Forgets one gateway's session. Returns false when there was nothing to forget. */
34
+ export declare function clear(gateway: string, ctx: CredentialPaths): boolean;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Where a signed-in session lives between runs: one owner-only file holding a Firebase
3
+ * refresh token, which is long-lived and acts as the user. Keyed by gateway URL, so a
4
+ * staging or local session cannot be handed to production.
5
+ */
6
+ import { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
7
+ import { dirname, join } from "node:path";
8
+ const DIR_MODE = 0o700;
9
+ const FILE_MODE = 0o600;
10
+ export function credentialsPath(ctx) {
11
+ return join(ctx.home, ".config", "ai21-gateway", "credentials.json");
12
+ }
13
+ function readFile(path) {
14
+ try {
15
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
16
+ return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
17
+ ? parsed
18
+ : undefined;
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ function isComplete(value) {
25
+ if (typeof value !== "object" || value === null)
26
+ return false;
27
+ const c = value;
28
+ return (typeof c["refreshToken"] === "string" &&
29
+ typeof c["firebaseApiKey"] === "string" &&
30
+ typeof c["projectId"] === "string" &&
31
+ typeof c["userId"] === "string" &&
32
+ typeof c["userEmail"] === "string");
33
+ }
34
+ export function load(gateway, ctx) {
35
+ const path = credentialsPath(ctx);
36
+ let mode;
37
+ try {
38
+ mode = statSync(path).mode & 0o777;
39
+ }
40
+ catch {
41
+ return { kind: "none" };
42
+ }
43
+ /* Checked on read too: the file may predate this version or have been copied in, and a
44
+ * readable refresh token is another local user's session.
45
+ *
46
+ * Skipped on Windows, which has no POSIX mode: Node reports 0o666 for an ordinary
47
+ * writable file, so this would refuse every session and advise a `chmod` that does not
48
+ * exist there. ACLs are the equivalent, and checking them is not this function's job. */
49
+ if (process.platform !== "win32" && (mode & 0o077) !== 0) {
50
+ return {
51
+ kind: "unusable",
52
+ reason: `${path} is readable by other users (mode ${mode.toString(8)}). Run \`chmod 600 ${path}\`, or delete it and sign in again.`,
53
+ };
54
+ }
55
+ const file = readFile(path);
56
+ if (file === undefined) {
57
+ return { kind: "unusable", reason: `${path} is not readable as JSON. Delete it and sign in again.` };
58
+ }
59
+ const entry = file[gateway];
60
+ if (entry === undefined)
61
+ return { kind: "none" };
62
+ return isComplete(entry)
63
+ ? { kind: "credential", credential: entry }
64
+ : { kind: "unusable", reason: `the stored session for ${gateway} is incomplete. Sign in again.` };
65
+ }
66
+ /**
67
+ * Writes one gateway's credential, leaving the others alone. Created at 0600 rather than
68
+ * chmodded after: the gap between the two is openable by another local user.
69
+ */
70
+ export function save(gateway, credential, ctx) {
71
+ const path = credentialsPath(ctx);
72
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
73
+ const existing = readFile(path) ?? {};
74
+ const merged = { ...existing, [gateway]: credential };
75
+ // Temp then rename, so an interrupted write cannot replace a whole session with half of one.
76
+ const temp = `${path}.tmp`;
77
+ writeFileSync(temp, `${JSON.stringify(merged, null, 2)}\n`, { mode: FILE_MODE });
78
+ chmodSync(temp, FILE_MODE);
79
+ renameSync(temp, path);
80
+ }
81
+ /** Forgets one gateway's session. Returns false when there was nothing to forget. */
82
+ export function clear(gateway, ctx) {
83
+ const path = credentialsPath(ctx);
84
+ const existing = readFile(path);
85
+ if (existing === undefined || existing[gateway] === undefined)
86
+ return false;
87
+ const rest = Object.fromEntries(Object.entries(existing).filter(([key]) => key !== gateway));
88
+ if (Object.keys(rest).length === 0) {
89
+ rmSync(path, { force: true });
90
+ return true;
91
+ }
92
+ const temp = `${path}.tmp`;
93
+ writeFileSync(temp, `${JSON.stringify(rest, null, 2)}\n`, { mode: FILE_MODE });
94
+ chmodSync(temp, FILE_MODE);
95
+ renameSync(temp, path);
96
+ return true;
97
+ }
98
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/login/credentials.ts"],"names":[],"mappings":"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"}