@ai21/gateway 0.6.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +49 -12
  2. package/dist/args.d.ts +4 -2
  3. package/dist/args.js +15 -6
  4. package/dist/args.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +45 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +3 -1
  9. package/dist/config.js +7 -3
  10. package/dist/config.js.map +1 -1
  11. package/dist/login/apiKeys.d.ts +20 -0
  12. package/dist/login/apiKeys.js +75 -0
  13. package/dist/login/apiKeys.js.map +1 -0
  14. package/dist/login/credentials.d.ts +21 -8
  15. package/dist/login/credentials.js +149 -41
  16. package/dist/login/credentials.js.map +1 -1
  17. package/dist/login/fileAcl.d.ts +29 -0
  18. package/dist/login/fileAcl.js +129 -0
  19. package/dist/login/fileAcl.js.map +1 -0
  20. package/dist/login/keychain/linux.d.ts +28 -0
  21. package/dist/login/keychain/linux.js +57 -0
  22. package/dist/login/keychain/linux.js.map +1 -0
  23. package/dist/login/keychain/macos.d.ts +30 -0
  24. package/dist/login/keychain/macos.js +52 -0
  25. package/dist/login/keychain/macos.js.map +1 -0
  26. package/dist/login/keychain/runner.d.ts +30 -0
  27. package/dist/login/keychain/runner.js +88 -0
  28. package/dist/login/keychain/runner.js.map +1 -0
  29. package/dist/login/keychain/select.d.ts +14 -0
  30. package/dist/login/keychain/select.js +74 -0
  31. package/dist/login/keychain/select.js.map +1 -0
  32. package/dist/login/lock.d.ts +16 -0
  33. package/dist/login/lock.js +139 -0
  34. package/dist/login/lock.js.map +1 -0
  35. package/dist/login/secretStore.d.ts +21 -0
  36. package/dist/login/secretStore.js +12 -0
  37. package/dist/login/secretStore.js.map +1 -0
  38. package/dist/login/session.d.ts +3 -0
  39. package/dist/login/session.js.map +1 -1
  40. package/dist/login/workspaces.d.ts +18 -1
  41. package/dist/login/workspaces.js +46 -2
  42. package/dist/login/workspaces.js.map +1 -1
  43. package/dist/precheck.d.ts +46 -0
  44. package/dist/precheck.js +86 -0
  45. package/dist/precheck.js.map +1 -0
  46. package/dist/prompt.d.ts +4 -19
  47. package/dist/prompt.js +1 -71
  48. package/dist/prompt.js.map +1 -1
  49. package/dist/report.d.ts +38 -10
  50. package/dist/report.js +138 -13
  51. package/dist/report.js.map +1 -1
  52. package/dist/result.d.ts +4 -0
  53. package/dist/result.js +4 -0
  54. package/dist/result.js.map +1 -1
  55. package/dist/router.d.ts +2 -0
  56. package/dist/router.js +285 -70
  57. package/dist/router.js.map +1 -1
  58. package/dist/snapshot.d.ts +27 -0
  59. package/dist/snapshot.js +55 -0
  60. package/dist/snapshot.js.map +1 -0
  61. package/dist/verify.d.ts +22 -1
  62. package/dist/verify.js +73 -6
  63. package/dist/verify.js.map +1 -1
  64. package/package.json +1 -1
package/dist/router.js CHANGED
@@ -2,19 +2,21 @@
2
2
  * Verb dispatch. Handlers return streams and an exit code rather than writing or
3
3
  * exiting, so a command can be asserted end to end without spawning a process.
4
4
  */
5
- import { containsControlCharacters } from "./args.js";
5
+ import { DEFAULT_URLS, containsControlCharacters } from "./args.js";
6
6
  import { resolvePaths, shadowingLocalConfig, writeConfig, } from "./config.js";
7
- import { promptForKey } from "./prompt.js";
8
- import { EXIT_FOR, collectWarnings, report, reportRevert } from "./report.js";
7
+ import { precheckKey } from "./precheck.js";
8
+ import { EXIT_FOR, collectWarnings, nothingWasWritten, report, reportNoClaudeCredential, reportRevert, } from "./report.js";
9
9
  import { revertConfig } from "./revert.js";
10
- import { save as saveCredential } from "./login/credentials.js";
10
+ import { keyName, mintApiKey } from "./login/apiKeys.js";
11
+ import { load as loadCredential, save as saveCredential } from "./login/credentials.js";
11
12
  import { runLogin } from "./login/session.js";
12
13
  import { DeadCredentialError, exchangeRefreshToken } from "./login/tokens.js";
13
- import { fetchWorkspaces } from "./login/workspaces.js";
14
+ import { chooseWorkspace, fetchWorkspaces, workspaceOwningAgent } from "./login/workspaces.js";
14
15
  import { EXIT } from "./result.js";
15
16
  import { AI21_KEY_PLACEHOLDER, ccSettings, ccSettingsEnv } from "./snippets.js";
16
17
  import { readVersion } from "./cli.js";
17
- import { verify } from "./verify.js";
18
+ import { restoreConfig, snapshotConfig } from "./snapshot.js";
19
+ import { checkClaudeLogin, verify } from "./verify.js";
18
20
  /* Identifies traffic this tool configured, so the gateway can tell a CLI-configured
19
21
  * agent from a hand-pasted one without the CLI reporting anything.
20
22
  *
@@ -90,7 +92,7 @@ function describeConflicts(conflicts) {
90
92
  return [
91
93
  ...lines,
92
94
  "",
93
- "Nothing was written. Re-run with --yes to overwrite; the previous file is backed up first.",
95
+ `${nothingWasWritten()} Re-run with --yes to overwrite; the previous file is backed up first.`,
94
96
  "",
95
97
  ].join("\n");
96
98
  }
@@ -100,51 +102,16 @@ function detailFor(outcome) {
100
102
  case "conflict":
101
103
  return describeConflicts(outcome.conflicts);
102
104
  case "malformed":
103
- return "Nothing was written. Fix or move the file, then re-run.\n";
105
+ return `${nothingWasWritten()} Fix or move the file, then re-run.\n`;
104
106
  case "failed":
105
107
  return "The existing file was left unchanged.\n";
106
108
  default:
107
109
  return undefined;
108
110
  }
109
111
  }
110
- /**
111
- * Resolves the key: the flag if given, otherwise a masked prompt. Returns a
112
- * `RunResult` when it could not be obtained, so the caller just forwards it.
113
- */
114
- async function resolveKey(args, io) {
115
- if (args.key !== undefined)
116
- return { key: args.key };
117
- const outcome = await promptForKey(io);
118
- switch (outcome.kind) {
119
- case "key": {
120
- // An empty line is a mistake, not a key. Refusing beats writing a config
121
- // that looks fine and fails every request.
122
- if (outcome.value.trim() === "") {
123
- return { code: EXIT.USAGE, out: "", err: "No key entered. Nothing was written.\n" };
124
- }
125
- // The prompt already drops control characters, but the invariant belongs
126
- // to whatever feeds a header value — asserting it here means a future
127
- // input path cannot quietly become a way around it.
128
- if (containsControlCharacters(outcome.value)) {
129
- return {
130
- code: EXIT.USAGE,
131
- out: "",
132
- err: "The key contains control characters. Nothing was written.\n",
133
- };
134
- }
135
- return { key: outcome.value };
136
- }
137
- case "cancelled":
138
- return { code: EXIT.USAGE, out: "", err: "Cancelled. Nothing was written.\n" };
139
- case "no-tty":
140
- // The alternative is blocking forever on a stdin that will never deliver
141
- // a line, which is how a CLI wedges a CI job.
142
- return {
143
- code: EXIT.USAGE,
144
- out: "",
145
- err: "--key is required when stdin is not a terminal. Pass --key <key>.\n",
146
- };
147
- }
112
+ /** The directory `claude` must run in for the file we write to be the one it reads. */
113
+ function verifyCwd(args, ctx) {
114
+ return args.target === "user" ? ctx.paths.home : ctx.paths.cwd;
148
115
  }
149
116
  /**
150
117
  * Verification runs only once the config is actually on disk — there is nothing to
@@ -166,18 +133,57 @@ async function verifyWrite(args, ctx, outcome, inputs) {
166
133
  // Verify from wherever the file we just wrote is the authoritative one — see
167
134
  // VerifyContext.cwd. A --user config verified from the project directory
168
135
  // would be shadowed by any repo-local settings.json.
169
- cwd: args.target === "user" ? ctx.paths.home : ctx.paths.cwd,
136
+ cwd: verifyCwd(args, ctx),
170
137
  }, ctx.verify);
171
138
  }
172
139
  /**
173
- * Write, verify, report. Shared by `install` and `login` so the two cannot drift:
174
- * whichever way the credentials were obtained, they go through one writer with one
175
- * set of conflict, backup and idempotency rules.
140
+ * Write, verify, report. The one writer every credential path goes through, so
141
+ * however they were obtained they meet the same conflict, backup and idempotency
142
+ * rules.
143
+ *
144
+ * Without a Claude login the gateway can never answer, so a config left in place would
145
+ * route Claude Code at a gateway that rejects everything. That is caught before the
146
+ * write when `claude auth status` can tell, and undone after it when verification
147
+ * proves it. `--no-verify` skips both, for installs with no Claude login yet by design.
176
148
  */
177
- async function writeAndReport(args, ctx, inputs) {
149
+ async function writeAndReport(args, ctx, inputs, precheck) {
178
150
  const paths = resolvePaths(args.target, ctx.paths, args.client);
151
+ if (!args.noVerify && (await checkClaudeLogin(verifyCwd(args, ctx), ctx.verify)) === "logged-out") {
152
+ const result = reportNoClaudeCredential({
153
+ path: paths.settings,
154
+ reason: "logged-out",
155
+ state: "not-written",
156
+ json: args.json,
157
+ urls: args.urls,
158
+ });
159
+ return { result, verification: undefined };
160
+ }
161
+ let snapshot;
162
+ try {
163
+ snapshot = snapshotConfig(paths);
164
+ }
165
+ catch {
166
+ // The writer reports an unreadable file itself; the write just goes unguarded.
167
+ snapshot = undefined;
168
+ }
179
169
  const outcome = writeConfig(paths, ccSettingsEnv(inputs), { force: args.yes });
180
170
  const verification = await verifyWrite(args, ctx, outcome, inputs);
171
+ if (verification?.kind === "no-claude-credential") {
172
+ const wrote = outcome.kind !== "unchanged";
173
+ const restore = wrote && snapshot !== undefined ? restoreConfig(snapshot) : undefined;
174
+ const result = reportNoClaudeCredential({
175
+ path: paths.settings,
176
+ reason: verification.reason,
177
+ state: !wrote
178
+ ? "unchanged"
179
+ : restore?.kind === "restored"
180
+ ? "restored"
181
+ : { failed: restore?.kind === "failed" ? restore.reason : "no snapshot of the previous file was taken" },
182
+ json: args.json,
183
+ urls: args.urls,
184
+ });
185
+ return { result, verification };
186
+ }
181
187
  const result = report({
182
188
  outcome,
183
189
  warnings: collectWarnings({
@@ -189,18 +195,158 @@ async function writeAndReport(args, ctx, inputs) {
189
195
  detail: detailFor(outcome),
190
196
  urls: args.urls,
191
197
  verification,
198
+ precheck,
192
199
  });
193
200
  return { result, verification };
194
201
  }
202
+ const MAX_AGENTS_LISTED = 5;
203
+ /** AI21 keys are per-environment, so a production key fails staging exactly like a typo. */
204
+ function environmentNote(args) {
205
+ return args.urls.gateway === DEFAULT_URLS.gateway
206
+ ? ""
207
+ : ", remembering that AI21 keys are per-environment — a production key will not work against this gateway";
208
+ }
209
+ function unknownAgentMessage(agentId, known) {
210
+ const quoted = `'${agentId}'`;
211
+ if (known.length === 0) {
212
+ return `The AI21 key is valid, but it has no agents at all, so ${quoted} cannot be one of them. ${nothingWasWritten()} Create an agent in the dashboard, then re-run.`;
213
+ }
214
+ const shown = [...known].sort().slice(0, MAX_AGENTS_LISTED);
215
+ const rest = known.length - shown.length;
216
+ const list = `${shown.join(", ")}${rest > 0 ? `, and ${rest} more` : ""}`;
217
+ return `The AI21 key is valid, but it has no agent ${quoted}. ${nothingWasWritten()} Agents on this key: ${list}.`;
218
+ }
219
+ /** The refusal for a key the gateway would not take. */
220
+ function rejectedKeyMessage(args) {
221
+ return (`The AI21 key was not accepted by ${args.urls.gateway}. ${nothingWasWritten()} ` +
222
+ `Check the key and re-run${environmentNote(args)}.\n`);
223
+ }
224
+ /**
225
+ * The key `install` writes: the flag, else the session this machine already has, else a
226
+ * sign-in. Signing in here is what makes `install` on a clean machine one command rather
227
+ * than two — the browser flow mints a key and the write carries on in the same run.
228
+ */
229
+ async function resolveKeyForInstall(args, ctx) {
230
+ if (args.key !== undefined)
231
+ return { key: args.key };
232
+ const stored = loadCredential(args.urls.gateway, credentialPaths(ctx));
233
+ // Otherwise a refused file looks like never having signed in, and the browser opens with no hint why.
234
+ if (stored.kind === "unusable")
235
+ ctx.notify(`Ignoring the stored session: ${stored.reason}`);
236
+ if (stored.kind === "credential") {
237
+ // Metadata without a secret reads as "not signed in", not as an error.
238
+ const key = await ctx.login.secrets.read(args.urls.gateway, "ai21Key");
239
+ if (key !== undefined)
240
+ return { key };
241
+ }
242
+ /* Signing in needs a human to compare the verification code, so CI keeps the contract
243
+ * it had before this verb could sign in at all. */
244
+ if (!(ctx.prompt.isTTY ?? ctx.prompt.input.isTTY ?? false)) {
245
+ return {
246
+ code: EXIT.USAGE,
247
+ out: "",
248
+ err: "--key is required when stdin is not a terminal. Pass --key <key>.\n",
249
+ };
250
+ }
251
+ const outcome = await runLogin(args.urls, ctx.login, { notify: ctx.notify });
252
+ switch (outcome.kind) {
253
+ case "timeout":
254
+ return {
255
+ code: EXIT.LOGIN_INCOMPLETE,
256
+ out: "",
257
+ err: "Timed out waiting for sign-in. Nothing was written.\nRun `ai21-gateway install` again.\n",
258
+ };
259
+ case "declined":
260
+ return {
261
+ code: EXIT.LOGIN_INCOMPLETE,
262
+ out: "",
263
+ err: `Sign-in was not completed: ${outcome.reason}. Nothing was written.\n`,
264
+ };
265
+ case "failed":
266
+ return { code: EXIT.INTERNAL, out: "", err: `Sign-in could not start: ${outcome.reason}.\n` };
267
+ case "credential": {
268
+ const session = await storeSession(args, ctx, outcome.credential);
269
+ // Its own message already says what failed and that nothing was written.
270
+ if (session.code !== EXIT.OK)
271
+ return session;
272
+ ctx.notify(session.out.trimEnd());
273
+ const key = await ctx.login.secrets.read(args.urls.gateway, "ai21Key");
274
+ return key !== undefined
275
+ ? { key }
276
+ : {
277
+ code: EXIT.INTERNAL,
278
+ out: "",
279
+ err: "Signed in, but the new key could not be read back. Run `ai21-gateway install` again.\n",
280
+ };
281
+ }
282
+ }
283
+ }
284
+ /**
285
+ * The key is checked before `writeConfig`, and only a definite rejection stops it. Both
286
+ * ways in are gated: a `--key` the caller passed, and the key the sign-in minted — which
287
+ * should be good by construction, but can still fail on entitlement or workspace.
288
+ */
195
289
  async function install(args, ctx) {
196
- const resolved = await resolveKey(args, ctx.prompt);
290
+ const resolved = await resolveKeyForInstall(args, ctx);
197
291
  if (!("key" in resolved))
198
292
  return resolved;
199
- return (await writeAndReport(args, ctx, { ...snippetInputs(args), ai21Key: resolved.key })).result;
293
+ /* A stored key can predate the mint-time check. Refused here, not left to precheck,
294
+ * which reports such a key as "inconclusive" and writes the config anyway. */
295
+ if (containsControlCharacters(resolved.key)) {
296
+ return {
297
+ code: EXIT.USAGE,
298
+ out: "",
299
+ err: "The AI21 key contains control characters, which would forge an extra request header.\n" +
300
+ `${nothingWasWritten()} Revoke that key in the dashboard and run \`ai21-gateway login\` again.\n`,
301
+ };
302
+ }
303
+ let key = resolved.key;
304
+ let outcome = await precheckKey({ agentsUrl: args.urls.agents, agentId: args.agentId ?? "", ai21Key: key }, ctx.precheck);
305
+ // A stored key sees only its own workspace's agents; mint one where this agent lives.
306
+ if (outcome.kind === "unknown-agent" && args.key === undefined) {
307
+ const moved = await rehomeStoredSession(args, ctx);
308
+ if (moved !== undefined) {
309
+ if (!("key" in moved))
310
+ return moved;
311
+ key = moved.key;
312
+ outcome = await precheckKey({ agentsUrl: args.urls.agents, agentId: args.agentId ?? "", ai21Key: key }, ctx.precheck);
313
+ }
314
+ }
315
+ if (outcome.kind === "unknown-agent") {
316
+ return { code: EXIT.USAGE, out: "", err: `${unknownAgentMessage(args.agentId, outcome.known)}\n` };
317
+ }
318
+ if (outcome.kind === "rejected")
319
+ return { code: EXIT.USAGE, out: "", err: rejectedKeyMessage(args) };
320
+ return (await writeAndReport(args, ctx, { ...snippetInputs(args), ai21Key: key }, outcome)).result;
321
+ }
322
+ /**
323
+ * Re-runs the stored session through `storeSession`, which picks the agent's workspace
324
+ * and mints there, without a browser round trip. Undefined when there is no stored
325
+ * session to reuse; a `RunResult` when that session could not be used.
326
+ */
327
+ async function rehomeStoredSession(args, ctx) {
328
+ const stored = loadCredential(args.urls.gateway, credentialPaths(ctx));
329
+ if (stored.kind !== "credential")
330
+ return undefined;
331
+ const refreshToken = await ctx.login.secrets.read(args.urls.gateway, "refreshToken");
332
+ if (refreshToken === undefined)
333
+ return undefined;
334
+ const { credential } = stored;
335
+ const session = await storeSession(args, ctx, {
336
+ refreshToken,
337
+ firebaseApiKey: credential.firebaseApiKey,
338
+ projectId: credential.projectId,
339
+ userId: credential.userId,
340
+ userEmail: credential.userEmail,
341
+ });
342
+ if (session.code !== EXIT.OK)
343
+ return session;
344
+ const key = await ctx.login.secrets.read(args.urls.gateway, "ai21Key");
345
+ return key === undefined ? undefined : { key };
200
346
  }
201
347
  /**
202
- * `login`: sign in through the browser and store the session. Writes no repo config —
203
- * that is `install`'s job. Agent creation from the stored session lands next.
348
+ * `login`: sign in through the browser, create an AI21 key, and store both. Writes no
349
+ * repo config — that is `install`'s job.
204
350
  */
205
351
  async function login(args, ctx) {
206
352
  if (!(ctx.prompt.isTTY ?? ctx.prompt.input.isTTY ?? false)) {
@@ -255,20 +401,85 @@ async function storeSession(args, ctx, credential) {
255
401
  : String(err)}\nNothing was stored. Try signing in again.\n`,
256
402
  };
257
403
  }
258
- // Best effort: a login that succeeded must not be lost to a listing.
259
404
  const available = await fetchWorkspaces(args.urls.gateway, exchanged.idToken, ctx.login.fetchImpl);
260
- const chosen = credential.workspaceId ?? (available.length === 1 ? available[0]?.id : undefined);
261
- const named = available.find((w) => w.id === chosen);
405
+ // `install --agent-id` needs the key where that agent lives; `--workspace` still wins.
406
+ const agentHome = args.workspaceId === undefined && args.agentId !== undefined
407
+ ? await workspaceOwningAgent(args.urls.agents, exchanged.idToken, available, args.agentId, ctx.login.fetchImpl)
408
+ : undefined;
409
+ const chosen = chooseWorkspace(available, args.workspaceId ?? agentHome?.id ?? credential.workspaceId);
410
+ if (chosen === undefined) {
411
+ // The session is still worth keeping: the refresh token is good, and discarding it
412
+ // would make the retry repeat the whole browser round trip for nothing.
413
+ const stored = await persist(args, ctx, credential, exchanged.refreshToken, undefined, undefined);
414
+ if (stored !== undefined)
415
+ return stored;
416
+ return { code: EXIT.NO_WORKSPACE, out: "", err: noWorkspaceMessage(args, available) };
417
+ }
418
+ /* Re-minting on every sign-in would leave a pile of keys nobody can tell apart, and
419
+ * identity's listing masks key values, so an existing key can only be recognised from
420
+ * what this machine already stored. */
421
+ const existing = await storedKeyFor(args, ctx, credential.userId, chosen.id);
422
+ let ai21Key = existing;
423
+ if (ai21Key === undefined) {
424
+ const minted = await mintApiKey(args.urls.gateway, exchanged.idToken, chosen.id, keyName(), ctx.login.fetchImpl);
425
+ if (minted.kind === "failed") {
426
+ const stored = await persist(args, ctx, credential, exchanged.refreshToken, chosen.id, undefined);
427
+ if (stored !== undefined)
428
+ return stored;
429
+ return {
430
+ code: EXIT.LOGIN_INCOMPLETE,
431
+ out: "",
432
+ err: `Signed in as ${credential.userEmail}, but no API key could be created: ${minted.reason}.\nYou are still signed in — re-run \`ai21-gateway login\` once that is resolved.\n`,
433
+ };
434
+ }
435
+ ai21Key = minted.value;
436
+ }
437
+ const stored = await persist(args, ctx, credential, exchanged.refreshToken, chosen.id, ai21Key);
438
+ if (stored !== undefined)
439
+ return stored;
440
+ return {
441
+ code: EXIT.OK,
442
+ out: `Signed in as ${credential.userEmail}.\n workspace: ${chosen.name}\n`,
443
+ err: "",
444
+ };
445
+ }
446
+ /**
447
+ * The stored key for this gateway, but only if the same user minted it in the same
448
+ * workspace. Workspaces are shared, so matching the workspace alone would hand one
449
+ * member's key to the next person who signs in on this machine.
450
+ */
451
+ async function storedKeyFor(args, ctx, userId, workspaceId) {
452
+ const outcome = loadCredential(args.urls.gateway, credentialPaths(ctx));
453
+ const sameOwner = outcome.kind === "credential" &&
454
+ outcome.credential.userId === userId &&
455
+ outcome.credential.workspaceId === workspaceId;
456
+ if (!sameOwner)
457
+ return undefined;
458
+ return ctx.login.secrets.read(args.urls.gateway, "ai21Key");
459
+ }
460
+ /**
461
+ * Writes the session. Returns a `RunResult` only when it could not be written.
462
+ *
463
+ * The old secrets are forgotten before anything is written. Metadata and secrets are
464
+ * separate writes, so a failure part way must leave "not signed in", never the new
465
+ * user's metadata next to the previous user's key.
466
+ */
467
+ async function persist(args, ctx, credential, refreshToken, workspaceId, ai21Key) {
262
468
  try {
469
+ await ctx.login.secrets.forget(args.urls.gateway, "refreshToken");
470
+ await ctx.login.secrets.forget(args.urls.gateway, "ai21Key");
263
471
  saveCredential(args.urls.gateway, {
264
- refreshToken: exchanged.refreshToken,
265
472
  firebaseApiKey: credential.firebaseApiKey,
266
473
  projectId: credential.projectId,
267
474
  userId: credential.userId,
268
475
  userEmail: credential.userEmail,
269
476
  obtainedAt: new Date().toISOString(),
270
- ...(chosen === undefined ? {} : { workspaceId: chosen }),
271
- }, ctx.paths);
477
+ ...(workspaceId === undefined ? {} : { workspaceId }),
478
+ }, credentialPaths(ctx));
479
+ await ctx.login.secrets.write(args.urls.gateway, "refreshToken", refreshToken);
480
+ if (ai21Key !== undefined)
481
+ await ctx.login.secrets.write(args.urls.gateway, "ai21Key", ai21Key);
482
+ return undefined;
272
483
  }
273
484
  catch (err) {
274
485
  return {
@@ -277,15 +488,19 @@ async function storeSession(args, ctx, credential) {
277
488
  err: `Signed in, but the session could not be stored: ${err instanceof Error ? err.message : String(err)}\n`,
278
489
  };
279
490
  }
280
- /* Only named when the listing corroborates it: printing a bare id — which is what an
281
- * unlisted workspace leaves, e.g. a legacy `personal` one that workspaces.ts filters —
282
- * reads as a glitch rather than as information. */
283
- const where = named === undefined ? "" : `\n workspace: ${named.name}`;
284
- return {
285
- code: EXIT.OK,
286
- out: `Signed in as ${credential.userEmail}.${where}\n`,
287
- err: "",
288
- };
491
+ }
492
+ /** Distinguishes "that id is not one of yours" from "you have none at all". */
493
+ function noWorkspaceMessage(args, available) {
494
+ if (available.length === 0) {
495
+ return ("Signed in, but you have no workspace an API key can be created in.\n" +
496
+ `Create one, or ask to be added to one, at ${args.urls.app} — then run \`ai21-gateway login\` again.\n`);
497
+ }
498
+ return (`Signed in, but no workspace of yours has the id '${args.workspaceId}'.\n` +
499
+ `Yours: ${available.map((workspace) => workspace.id).join(", ")}\n` +
500
+ "No API key was created.\n");
501
+ }
502
+ function credentialPaths(ctx) {
503
+ return { home: ctx.paths.home, warn: ctx.notify };
289
504
  }
290
505
  /** `uninstall`: hand the resolved paths to the reverter and report what it did. */
291
506
  function uninstall(args, ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type ConfigPaths } from "./config.js";
2
+ /** One file as it was: its bytes and mode, or the fact that it did not exist. */
3
+ type FileState = {
4
+ readonly path: string;
5
+ readonly present: true;
6
+ readonly contents: Buffer;
7
+ readonly mode: number;
8
+ } | {
9
+ readonly path: string;
10
+ readonly present: false;
11
+ };
12
+ export interface ConfigSnapshot {
13
+ readonly settings: FileState;
14
+ /** Absent when settings.json did not exist, since the writer backs up nothing then. */
15
+ readonly backup?: FileState | undefined;
16
+ }
17
+ export type RestoreOutcome = {
18
+ readonly kind: "restored";
19
+ } | {
20
+ readonly kind: "failed";
21
+ readonly reason: string;
22
+ };
23
+ /** Throws on an unreadable file; the caller refuses to write rather than write unguarded. */
24
+ export declare function snapshotConfig(paths: ConfigPaths): ConfigSnapshot;
25
+ /** Puts both files back. Directories the writer created are left: they hold nothing. */
26
+ export declare function restoreConfig(snapshot: ConfigSnapshot): RestoreOutcome;
27
+ export {};
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The pre-run state of settings.json and its backup, held in memory so a write that
3
+ * turns out to be useless can be undone exactly. Deliberately not `uninstall`: that
4
+ * removes our keys, which on a re-run over an older AI21 config would delete a setup
5
+ * that was working before this run started.
6
+ */
7
+ import { chmodSync, existsSync, lstatSync, readFileSync, readlinkSync, realpathSync, rmSync, statSync } from "node:fs";
8
+ import { dirname, resolve } from "node:path";
9
+ import { atomicWrite, backupPathFor, describeFsError } from "./config.js";
10
+ function capture(path) {
11
+ if (!existsSync(path))
12
+ return { path, present: false };
13
+ return { path, present: true, contents: readFileSync(path), mode: statSync(path).mode & 0o777 };
14
+ }
15
+ /**
16
+ * Where the writer will actually write. Mirrors `writeConfig`: an existing file is
17
+ * written through its real path, and a dangling symlink through its one-level target,
18
+ * so a restore puts things back where they were read from and the link survives.
19
+ */
20
+ function writeTarget(settings) {
21
+ if (existsSync(settings))
22
+ return realpathSync(settings);
23
+ if (lstatSync(settings, { throwIfNoEntry: false })?.isSymbolicLink() === true) {
24
+ return resolve(dirname(settings), readlinkSync(settings));
25
+ }
26
+ return settings;
27
+ }
28
+ /** Throws on an unreadable file; the caller refuses to write rather than write unguarded. */
29
+ export function snapshotConfig(paths) {
30
+ const target = writeTarget(paths.settings);
31
+ const settings = capture(target);
32
+ return settings.present ? { settings, backup: capture(backupPathFor(paths, target)) } : { settings };
33
+ }
34
+ function put(state) {
35
+ if (!state.present) {
36
+ rmSync(state.path, { force: true });
37
+ return;
38
+ }
39
+ atomicWrite(state.path, state.contents);
40
+ // atomicWrite always lands 0600; the file goes back to the mode it had.
41
+ chmodSync(state.path, state.mode);
42
+ }
43
+ /** Puts both files back. Directories the writer created are left: they hold nothing. */
44
+ export function restoreConfig(snapshot) {
45
+ try {
46
+ put(snapshot.settings);
47
+ if (snapshot.backup !== undefined)
48
+ put(snapshot.backup);
49
+ }
50
+ catch (err) {
51
+ return { kind: "failed", reason: describeFsError(err) };
52
+ }
53
+ return { kind: "restored" };
54
+ }
55
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAoB,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAe5F,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;QAC9E,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;AACvG,CAAC;AAED,SAAS,GAAG,CAAC,KAAgB;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,wEAAwE;IACxE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,QAAwB;IACpD,IAAI,CAAC;QACH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
package/dist/verify.d.ts CHANGED
@@ -20,7 +20,12 @@ export declare const PING_BODY: {
20
20
  }];
21
21
  };
22
22
  export type VerifyVia = "claude-cli" | "direct-ping";
23
- /** How verification ended. Never maps to a non-zero exit code. */
23
+ /**
24
+ * Why the Anthropic side definitely cannot work: `claude` has no login at all, or the
25
+ * API key the direct ping sent was refused by Anthropic itself.
26
+ */
27
+ export type MissingCredential = "logged-out" | "key-rejected";
28
+ /** How verification ended. Only `no-claude-credential` maps to a non-zero exit code. */
24
29
  export type VerifyOutcome = {
25
30
  readonly kind: "disabled";
26
31
  } | {
@@ -33,6 +38,10 @@ export type VerifyOutcome = {
33
38
  readonly kind: "failed";
34
39
  readonly via: VerifyVia;
35
40
  readonly reason: string;
41
+ } | {
42
+ readonly kind: "no-claude-credential";
43
+ readonly via: VerifyVia;
44
+ readonly reason: MissingCredential;
36
45
  };
37
46
  export interface VerifyContext {
38
47
  readonly urls: ResolvedUrls;
@@ -91,6 +100,18 @@ export declare function findOnPath(command: string, lookup: PathLookup): string
91
100
  * `x-api-key` cannot succeed, so whichever layer answers is the answer.
92
101
  */
93
102
  export type CredentialVerdict = "ai21-rejected" | "ai21-accepted" | "inconclusive";
103
+ /** `claude auth status` is local and answers in about a second. */
104
+ export declare const AUTH_STATUS_TIMEOUT_MS = 5000;
105
+ export type ClaudeLogin = "logged-in" | "logged-out" | "inconclusive";
106
+ /**
107
+ * Asks `claude auth status`, which reads local state only, whether Claude Code has any
108
+ * credential — so a missing one is caught before anything is written. Only an explicit
109
+ * `"loggedIn": false` with no auth method counts as logged out, and only for Anthropic's
110
+ * own API: an older `claude` without the subcommand, unparseable output, or a Bedrock or
111
+ * Vertex setup are all inconclusive and leave the decision to verification.
112
+ */
113
+ export declare function checkClaudeLogin(cwd: string, deps: VerifyDeps): Promise<ClaudeLogin>;
94
114
  export declare function verify(ctx: VerifyContext, deps: VerifyDeps): Promise<VerifyOutcome>;
115
+ export declare function isExecutableFile(candidate: string): boolean;
95
116
  /** The real-world adapters, kept here so `cli.ts` stays a thin edge. */
96
117
  export declare function nodeVerifyDeps(processEnv: Record<string, string | undefined>): VerifyDeps;