@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.
- package/README.md +49 -12
- package/dist/args.d.ts +4 -2
- package/dist/args.js +15 -6
- package/dist/args.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +45 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.js +7 -3
- package/dist/config.js.map +1 -1
- package/dist/login/apiKeys.d.ts +20 -0
- package/dist/login/apiKeys.js +75 -0
- package/dist/login/apiKeys.js.map +1 -0
- package/dist/login/credentials.d.ts +21 -8
- package/dist/login/credentials.js +149 -41
- package/dist/login/credentials.js.map +1 -1
- package/dist/login/fileAcl.d.ts +29 -0
- package/dist/login/fileAcl.js +129 -0
- package/dist/login/fileAcl.js.map +1 -0
- package/dist/login/keychain/linux.d.ts +28 -0
- package/dist/login/keychain/linux.js +57 -0
- package/dist/login/keychain/linux.js.map +1 -0
- package/dist/login/keychain/macos.d.ts +30 -0
- package/dist/login/keychain/macos.js +52 -0
- package/dist/login/keychain/macos.js.map +1 -0
- package/dist/login/keychain/runner.d.ts +30 -0
- package/dist/login/keychain/runner.js +88 -0
- package/dist/login/keychain/runner.js.map +1 -0
- package/dist/login/keychain/select.d.ts +14 -0
- package/dist/login/keychain/select.js +74 -0
- package/dist/login/keychain/select.js.map +1 -0
- package/dist/login/lock.d.ts +16 -0
- package/dist/login/lock.js +139 -0
- package/dist/login/lock.js.map +1 -0
- package/dist/login/secretStore.d.ts +21 -0
- package/dist/login/secretStore.js +12 -0
- package/dist/login/secretStore.js.map +1 -0
- package/dist/login/session.d.ts +3 -0
- package/dist/login/session.js.map +1 -1
- package/dist/login/workspaces.d.ts +18 -1
- package/dist/login/workspaces.js +46 -2
- package/dist/login/workspaces.js.map +1 -1
- package/dist/precheck.d.ts +46 -0
- package/dist/precheck.js +86 -0
- package/dist/precheck.js.map +1 -0
- package/dist/prompt.d.ts +4 -19
- package/dist/prompt.js +1 -71
- package/dist/prompt.js.map +1 -1
- package/dist/report.d.ts +38 -10
- package/dist/report.js +138 -13
- package/dist/report.js.map +1 -1
- package/dist/result.d.ts +4 -0
- package/dist/result.js +4 -0
- package/dist/result.js.map +1 -1
- package/dist/router.d.ts +2 -0
- package/dist/router.js +285 -70
- package/dist/router.js.map +1 -1
- package/dist/snapshot.d.ts +27 -0
- package/dist/snapshot.js +55 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/verify.d.ts +22 -1
- package/dist/verify.js +73 -6
- package/dist/verify.js.map +1 -1
- 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 {
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
112
|
-
|
|
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
|
|
136
|
+
cwd: verifyCwd(args, ctx),
|
|
170
137
|
}, ctx.verify);
|
|
171
138
|
}
|
|
172
139
|
/**
|
|
173
|
-
* Write, verify, report.
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
|
290
|
+
const resolved = await resolveKeyForInstall(args, ctx);
|
|
197
291
|
if (!("key" in resolved))
|
|
198
292
|
return resolved;
|
|
199
|
-
|
|
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
|
|
203
|
-
* that is `install`'s job.
|
|
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
|
-
|
|
261
|
-
const
|
|
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
|
-
...(
|
|
271
|
-
}, ctx
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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) {
|
package/dist/router.js.map
CHANGED
|
@@ -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 {};
|
package/dist/snapshot.js
ADDED
|
@@ -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
|
-
/**
|
|
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;
|