@ai21/gateway 1.2.0 → 1.3.1
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 +5 -4
- package/dist/agents/claude-code/revert.d.ts +11 -0
- package/dist/{revert.js → agents/claude-code/revert.js} +2 -1
- package/dist/agents/claude-code/revert.js.map +1 -0
- package/dist/agents/claude-code/settings.d.ts +33 -0
- package/dist/{config.js → agents/claude-code/settings.js} +6 -57
- package/dist/agents/claude-code/settings.js.map +1 -0
- package/dist/{snippets.d.ts → agents/claude-code/snippets.d.ts} +1 -18
- package/dist/{snippets.js → agents/claude-code/snippets.js} +0 -19
- package/dist/agents/claude-code/snippets.js.map +1 -0
- package/dist/agents/claude-code/status.d.ts +12 -0
- package/dist/agents/claude-code/status.js +42 -0
- package/dist/agents/claude-code/status.js.map +1 -0
- package/dist/{verify.d.ts → agents/claude-code/verify.d.ts} +14 -54
- package/dist/{verify.js → agents/claude-code/verify.js} +2 -133
- package/dist/agents/claude-code/verify.js.map +1 -0
- package/dist/agents/deps.d.ts +3 -0
- package/dist/agents/deps.js +10 -0
- package/dist/agents/deps.js.map +1 -0
- package/dist/agents/types.d.ts +266 -0
- package/dist/agents/types.js +3 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.js +23 -3
- package/dist/cli.js.map +1 -1
- package/dist/fs/safeFile.d.ts +19 -0
- package/dist/fs/safeFile.js +50 -0
- package/dist/fs/safeFile.js.map +1 -0
- package/dist/{snapshot.d.ts → fs/snapshot.d.ts} +1 -1
- package/dist/{snapshot.js → fs/snapshot.js} +1 -1
- package/dist/fs/snapshot.js.map +1 -0
- package/dist/login/keychain/linux.d.ts +1 -1
- package/dist/login/keychain/linux.js +1 -1
- package/dist/login/keychain/linux.js.map +1 -1
- package/dist/login/session.d.ts +12 -0
- package/dist/login/session.js +23 -5
- package/dist/login/session.js.map +1 -1
- package/dist/process.d.ts +26 -0
- package/dist/process.js +94 -0
- package/dist/process.js.map +1 -0
- package/dist/prompt.d.ts +5 -7
- package/dist/prompt.js +23 -1
- package/dist/prompt.js.map +1 -1
- package/dist/report.d.ts +5 -8
- package/dist/report.js +46 -17
- package/dist/report.js.map +1 -1
- package/dist/router.d.ts +5 -3
- package/dist/router.js +73 -25
- package/dist/router.js.map +1 -1
- package/dist/status.d.ts +31 -0
- package/dist/status.js +107 -0
- package/dist/status.js.map +1 -0
- package/dist/telemetry/amplitudeHttp.js +1 -0
- package/dist/telemetry/amplitudeHttp.js.map +1 -1
- package/dist/telemetry/events.d.ts +7 -3
- package/dist/telemetry/telemetry.d.ts +6 -2
- package/dist/telemetry/telemetry.js +19 -8
- package/dist/telemetry/telemetry.js.map +1 -1
- package/package.json +3 -3
- package/dist/config.d.ts +0 -83
- package/dist/config.js.map +0 -1
- package/dist/revert.d.ts +0 -60
- package/dist/revert.js.map +0 -1
- package/dist/snapshot.js.map +0 -1
- package/dist/snippets.js.map +0 -1
- package/dist/verify.js.map +0 -1
package/dist/process.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding and running local executables with a hard time budget. Shared by the coding
|
|
3
|
+
* agents (their own CLIs) and the Linux keychain (`secret-tool`).
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { accessSync, constants, statSync } from "node:fs";
|
|
7
|
+
/** npm installs the Claude Code CLI as `claude.cmd`, so this must not be empty. */
|
|
8
|
+
const DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD";
|
|
9
|
+
/**
|
|
10
|
+
* Hand-rolled rather than shelling out to `which`/`where`, which is slower and
|
|
11
|
+
* absent from stripped Windows images. `node:path`'s `join` and `delimiter` follow
|
|
12
|
+
* the *host* platform, so they cannot resolve a Windows PATH under test on macOS.
|
|
13
|
+
*/
|
|
14
|
+
export function findOnPath(command, lookup) {
|
|
15
|
+
const windows = lookup.platform === "win32";
|
|
16
|
+
const separator = windows ? ";" : ":";
|
|
17
|
+
const raw = lookup.processEnv.PATH ?? (windows ? lookup.processEnv.Path : undefined) ?? "";
|
|
18
|
+
const extensions = windows ? (lookup.processEnv.PATHEXT ?? DEFAULT_PATHEXT).split(";") : [""];
|
|
19
|
+
for (const dir of raw.split(separator)) {
|
|
20
|
+
if (dir === "")
|
|
21
|
+
continue;
|
|
22
|
+
for (const extension of extensions) {
|
|
23
|
+
const candidate = `${dir.replace(/[\\/]+$/, "")}${windows ? "\\" : "/"}${command}${extension}`;
|
|
24
|
+
if (lookup.isExecutableFile(candidate))
|
|
25
|
+
return candidate;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Cap on captured subprocess output — only the first line is ever quoted. */
|
|
31
|
+
const MAX_CAPTURED_OUTPUT = 4_096;
|
|
32
|
+
export const runCommand = (executable, args, opts) => {
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
// A .cmd cannot be spawned without a shell since the CVE-2024-27980 fix. Safe
|
|
35
|
+
// here because every argument is a literal. Killing the shell may orphan the
|
|
36
|
+
// real `claude`, which exits on its own shortly after.
|
|
37
|
+
const shell = /\.(cmd|bat)$/i.test(executable);
|
|
38
|
+
const child = spawn(shell ? `"${executable}"` : executable, [...args], {
|
|
39
|
+
cwd: opts.cwd,
|
|
40
|
+
shell,
|
|
41
|
+
// stdin closed: `claude` must never sit waiting on input we will not send.
|
|
42
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
43
|
+
});
|
|
44
|
+
let output = "";
|
|
45
|
+
const capture = (chunk) => {
|
|
46
|
+
if (output.length < MAX_CAPTURED_OUTPUT)
|
|
47
|
+
output += chunk.toString("utf8");
|
|
48
|
+
};
|
|
49
|
+
child.stdout?.on("data", capture);
|
|
50
|
+
child.stderr?.on("data", capture);
|
|
51
|
+
let done = false;
|
|
52
|
+
const settle = (result) => {
|
|
53
|
+
if (done)
|
|
54
|
+
return;
|
|
55
|
+
done = true;
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
resolve(result);
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Our own timer, not spawn's `timeout`: Windows reports a killed process as an
|
|
61
|
+
* ordinary non-zero exit, so an inferred timeout would be wrong there.
|
|
62
|
+
*
|
|
63
|
+
* It resolves the promise itself rather than killing and waiting for `close`.
|
|
64
|
+
* `close` fires when the *stdio* closes, and anything `claude` spawned inherits
|
|
65
|
+
* those pipes — an MCP server or a hook outliving its parent holds them open, so
|
|
66
|
+
* the kill lands and `close` never comes. That hung the CLI indefinitely after a
|
|
67
|
+
* write it had already completed. The budget is now a guarantee, not a hope.
|
|
68
|
+
*/
|
|
69
|
+
let timedOut = false;
|
|
70
|
+
const timer = setTimeout(() => {
|
|
71
|
+
timedOut = true;
|
|
72
|
+
child.kill("SIGKILL");
|
|
73
|
+
settle({ code: null, timedOut, output: output.trim() });
|
|
74
|
+
}, opts.timeoutMs);
|
|
75
|
+
// A spawn error may never emit `close`, so both paths settle. Only the errno is
|
|
76
|
+
// kept — the message carries an absolute path.
|
|
77
|
+
child.once("error", (err) => settle({ code: null, timedOut, output: err.code ?? "" }));
|
|
78
|
+
child.once("close", (code) => settle({ code, timedOut, output: output.trim() }));
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
export function isExecutableFile(candidate) {
|
|
82
|
+
try {
|
|
83
|
+
if (!statSync(candidate).isFile())
|
|
84
|
+
return false;
|
|
85
|
+
// The execute bit is meaningless on Windows, where the extension decides.
|
|
86
|
+
if (process.platform !== "win32")
|
|
87
|
+
accessSync(candidate, constants.X_OK);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt.d.ts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The terminal the CLI was run from.
|
|
3
|
-
*
|
|
4
|
-
* All that is left of the key prompt: pasting a key is error-prone, so the only ways in
|
|
5
|
-
* are `--key` and signing in through the browser. What survives is the tty check, which
|
|
6
|
-
* decides whether a sign-in can be offered at all.
|
|
7
|
-
*/
|
|
8
1
|
import type { Readable, Writable } from "node:stream";
|
|
9
2
|
export interface PromptIo {
|
|
10
3
|
readonly input: Readable & {
|
|
@@ -15,3 +8,8 @@ export interface PromptIo {
|
|
|
15
8
|
/** Overrides the stream's own flag; tests drive a pipe as though it were a tty. */
|
|
16
9
|
readonly isTTY?: boolean;
|
|
17
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolves true on the next Enter, false if the input ends first (Ctrl-D, a closed pipe).
|
|
13
|
+
* The interface is closed either way, so stdin does not keep the process alive.
|
|
14
|
+
*/
|
|
15
|
+
export declare function waitForEnter(input: Readable): Promise<boolean>;
|
package/dist/prompt.js
CHANGED
|
@@ -1,2 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The terminal the CLI was run from.
|
|
3
|
+
*
|
|
4
|
+
* All that is left of the key prompt: pasting a key is error-prone, so the only ways in
|
|
5
|
+
* are `--key` and signing in through the browser. What survives is the tty check, which
|
|
6
|
+
* decides whether a sign-in can be offered at all, and the Enter that opens the browser.
|
|
7
|
+
*/
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
9
|
+
/**
|
|
10
|
+
* Resolves true on the next Enter, false if the input ends first (Ctrl-D, a closed pipe).
|
|
11
|
+
* The interface is closed either way, so stdin does not keep the process alive.
|
|
12
|
+
*/
|
|
13
|
+
export function waitForEnter(input) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
const rl = createInterface({ input });
|
|
16
|
+
let answered = false;
|
|
17
|
+
rl.once("line", () => {
|
|
18
|
+
answered = true;
|
|
19
|
+
rl.close();
|
|
20
|
+
});
|
|
21
|
+
rl.once("close", () => resolve(answered));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
2
24
|
//# sourceMappingURL=prompt.js.map
|
package/dist/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAUhD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAe;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACnB,QAAQ,GAAG,IAAI,CAAC;YAChB,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/report.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { ResolvedUrls } from "./args.js";
|
|
2
|
-
import type { ConfigOutcome } from "./
|
|
2
|
+
import type { ConfigOutcome, RevertOutcome, Warning } from "./agents/types.js";
|
|
3
3
|
import type { PrecheckOutcome } from "./precheck.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type { MissingCredential, VerifyOutcome } from "./verify.js";
|
|
4
|
+
import type { MissingCredential, VerifyOutcome } from "./agents/claude-code/verify.js";
|
|
6
5
|
import { type RunResult } from "./result.js";
|
|
7
6
|
/**
|
|
8
7
|
* Outcome name → exit code. This is the map `--json` consumers branch on, so the
|
|
@@ -27,11 +26,7 @@ export interface ColorTargets {
|
|
|
27
26
|
/** `NOTHING_WRITTEN`, painted for stderr — the stream every refusal that says it lands on. */
|
|
28
27
|
export declare function nothingWasWritten(streams?: ColorTargets): string;
|
|
29
28
|
export declare function reportRevert(outcome: RevertOutcome, json: boolean, streams?: ColorTargets): RunResult;
|
|
30
|
-
export
|
|
31
|
-
/** Stable identifier, so `--json` consumers match on this and not on prose. */
|
|
32
|
-
readonly code: "anthropic-api-key-set" | "shadowed-by-local-config" | "non-production-gateway" | "insecure-gateway" | "verification-skipped" | "verification-failed" | "key-check-inconclusive";
|
|
33
|
-
readonly message: string;
|
|
34
|
-
}
|
|
29
|
+
export type { Warning } from "./agents/types.js";
|
|
35
30
|
export interface WarningContext {
|
|
36
31
|
readonly urls: ResolvedUrls;
|
|
37
32
|
/** The process environment, injected so tests need not mutate the real one. */
|
|
@@ -80,5 +75,7 @@ export interface NoCredentialInput {
|
|
|
80
75
|
* gateway can never answer, so a config left in place only breaks Claude Code.
|
|
81
76
|
*/
|
|
82
77
|
export declare function reportNoClaudeCredential(input: NoCredentialInput): RunResult;
|
|
78
|
+
/** `login`'s success: who is signed in, and the workspace any key was minted in. */
|
|
79
|
+
export declare function reportSignedIn(email: string, workspace: string, streams?: ColorTargets): RunResult;
|
|
83
80
|
/** Refused before anything else runs: without `claude` there is nothing to configure. */
|
|
84
81
|
export declare function reportNoClaudeCli(json: boolean, streams?: ColorTargets): RunResult;
|
package/dist/report.js
CHANGED
|
@@ -57,6 +57,17 @@ function painterFor(target) {
|
|
|
57
57
|
return PLAIN;
|
|
58
58
|
return (format, text) => styleText(format, text, { validateStream: false });
|
|
59
59
|
}
|
|
60
|
+
const MARK = { green: "✔", red: "✖", yellow: "⚠" };
|
|
61
|
+
/**
|
|
62
|
+
* A result line in its tone, led by a symbol so pass and fail read apart at a glance.
|
|
63
|
+
* The symbol rides with colour: plain output stays byte-identical, which is the
|
|
64
|
+
* contract every existing output assertion and log scraper relies on.
|
|
65
|
+
*/
|
|
66
|
+
function headline(paint, tone, text) {
|
|
67
|
+
if (paint === PLAIN)
|
|
68
|
+
return text;
|
|
69
|
+
return `${paint(tone, MARK[tone])} ${paint(tone, text)}`;
|
|
70
|
+
}
|
|
60
71
|
/**
|
|
61
72
|
* The sentence a refusal exists to deliver: it answers the only question a refusal
|
|
62
73
|
* raises — what happened to my file? — so it is painted like a `warning:` label
|
|
@@ -70,19 +81,20 @@ const NOTHING_WRITTEN = "Nothing was written.";
|
|
|
70
81
|
export function nothingWasWritten(streams = PROCESS_STREAMS) {
|
|
71
82
|
return painterFor(streams.err)("yellow", NOTHING_WRITTEN);
|
|
72
83
|
}
|
|
73
|
-
function revertLine(outcome) {
|
|
84
|
+
function revertLine(outcome, paint) {
|
|
85
|
+
const path = paint("bold", outcome.path);
|
|
74
86
|
switch (outcome.kind) {
|
|
75
87
|
case "reverted": {
|
|
76
88
|
const parts = [
|
|
77
89
|
outcome.restored.length > 0 ? `restored ${outcome.restored.join(", ")} to previous values` : undefined,
|
|
78
90
|
outcome.removed.length > 0 ? `removed ${outcome.removed.join(", ")}` : undefined,
|
|
79
91
|
].filter((part) => part !== undefined);
|
|
80
|
-
return `Reverted ${
|
|
92
|
+
return `Reverted ${path} — ${parts.join("; ")}`;
|
|
81
93
|
}
|
|
82
94
|
case "restored":
|
|
83
|
-
return `Restored ${
|
|
95
|
+
return `Restored ${path} from ${outcome.backup}`;
|
|
84
96
|
case "not-configured":
|
|
85
|
-
return `Nothing to revert — ${
|
|
97
|
+
return `Nothing to revert — ${path} does not carry this tool's settings.`;
|
|
86
98
|
case "agent-mismatch":
|
|
87
99
|
return `${outcome.path} is configured for agent '${outcome.actual}', not '${outcome.expected}'.`;
|
|
88
100
|
case "drifted":
|
|
@@ -129,9 +141,9 @@ export function reportRevert(outcome, json, streams = PROCESS_STREAMS) {
|
|
|
129
141
|
const ok = code === EXIT.OK;
|
|
130
142
|
// Colour tracks the exit code, with one exception: `not-configured` is a state,
|
|
131
143
|
// not a refusal, and painting "nothing to revert" red reads like a crash.
|
|
132
|
-
const
|
|
144
|
+
const tone = outcome.kind === "not-configured" ? "yellow" : ok ? "green" : "red";
|
|
133
145
|
const paint = painterFor(ok ? streams.out : streams.err);
|
|
134
|
-
const body = `${paint
|
|
146
|
+
const body = `${headline(paint, tone, revertLine(outcome, paint))}\n${revertDetail(outcome, paint)}`;
|
|
135
147
|
return ok ? { code, out: body, err: "" } : { code, out: "", err: body };
|
|
136
148
|
}
|
|
137
149
|
/**
|
|
@@ -176,14 +188,15 @@ export function collectWarnings(ctx) {
|
|
|
176
188
|
return warnings;
|
|
177
189
|
}
|
|
178
190
|
/** Human-readable line for a config outcome. Never includes the key. */
|
|
179
|
-
function humanLine(outcome) {
|
|
191
|
+
function humanLine(outcome, paint) {
|
|
192
|
+
const path = paint("bold", outcome.path);
|
|
180
193
|
switch (outcome.kind) {
|
|
181
194
|
case "created":
|
|
182
|
-
return `Wrote ${
|
|
195
|
+
return `Wrote ${path}`;
|
|
183
196
|
case "updated":
|
|
184
|
-
return `Updated ${
|
|
197
|
+
return `Updated ${path} (${outcome.changed.join(", ")})`;
|
|
185
198
|
case "unchanged":
|
|
186
|
-
return `Already configured — ${
|
|
199
|
+
return `Already configured — ${path} is up to date.`;
|
|
187
200
|
case "conflict":
|
|
188
201
|
return `${outcome.path} already sets values this command would change.`;
|
|
189
202
|
case "malformed":
|
|
@@ -228,10 +241,16 @@ function precheckWarning(outcome) {
|
|
|
228
241
|
};
|
|
229
242
|
}
|
|
230
243
|
/** The stdout line for a successful verification; nothing for any other outcome. */
|
|
231
|
-
function verificationLine(outcome) {
|
|
244
|
+
function verificationLine(outcome, paint) {
|
|
232
245
|
if (outcome?.kind !== "passed")
|
|
233
246
|
return "";
|
|
234
|
-
return `Verified through the gateway with ${VERIFIED_VIA[outcome.via]}
|
|
247
|
+
return `${headline(paint, "green", `Verified through the gateway with ${VERIFIED_VIA[outcome.via]}.`)}\n`;
|
|
248
|
+
}
|
|
249
|
+
/** An aside under the headline, dimmed so the headline stays the thing read first. */
|
|
250
|
+
function backupLine(outcome, paint) {
|
|
251
|
+
if (outcome.kind !== "updated")
|
|
252
|
+
return "";
|
|
253
|
+
return `${paint("dim", `Backed up the previous file to ${outcome.backup}`)}\n`;
|
|
235
254
|
}
|
|
236
255
|
/**
|
|
237
256
|
* One JSON object with what happened, where, why it exited that way, and any
|
|
@@ -290,9 +309,10 @@ export function report(input) {
|
|
|
290
309
|
const paintWarning = painterFor(streams.err);
|
|
291
310
|
// Only the label is coloured: the message is prose, and a paragraph of yellow is
|
|
292
311
|
// harder to read than the plain one it replaced.
|
|
293
|
-
const warningText = warnings.map((w) => `${paintWarning
|
|
294
|
-
const line = paintBody
|
|
295
|
-
const body = `${line}\n${
|
|
312
|
+
const warningText = warnings.map((w) => `${headline(paintWarning, "yellow", "warning:")} ${w.message}\n`).join("");
|
|
313
|
+
const line = headline(paintBody, ok ? "green" : "red", humanLine(input.outcome, paintBody));
|
|
314
|
+
const body = `${line}\n${backupLine(input.outcome, paintBody)}` +
|
|
315
|
+
`${verificationLine(input.verification, paintBody)}${input.detail ?? ""}`;
|
|
296
316
|
return ok ? { code, out: body, err: warningText } : { code, out: "", err: `${body}${warningText}` };
|
|
297
317
|
}
|
|
298
318
|
/** Stable `--json` reasons, spelled for a funnel rather than for a person. */
|
|
@@ -340,11 +360,20 @@ export function reportNoClaudeCredential(input) {
|
|
|
340
360
|
return { code, out: `${JSON.stringify(payload, null, 2)}\n`, err: "" };
|
|
341
361
|
}
|
|
342
362
|
const streams = input.streams ?? PROCESS_STREAMS;
|
|
343
|
-
const
|
|
363
|
+
const title = headline(painterFor(streams.err), "red", NO_CREDENTIAL_HEADLINE[input.reason]);
|
|
344
364
|
return {
|
|
345
365
|
code,
|
|
346
366
|
out: "",
|
|
347
|
-
err: `${
|
|
367
|
+
err: `${title} ${NO_CREDENTIAL_NEXT_STEP[input.reason]}\n${noCredentialStateLine(input, streams)}\n`,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
/** `login`'s success: who is signed in, and the workspace any key was minted in. */
|
|
371
|
+
export function reportSignedIn(email, workspace, streams = PROCESS_STREAMS) {
|
|
372
|
+
const paint = painterFor(streams.out);
|
|
373
|
+
return {
|
|
374
|
+
code: EXIT.OK,
|
|
375
|
+
out: `${headline(paint, "green", `Signed in as ${paint("bold", email)}.`)}\n workspace: ${paint("bold", workspace)}\n`,
|
|
376
|
+
err: "",
|
|
348
377
|
};
|
|
349
378
|
}
|
|
350
379
|
/** Stable `--json` reason; kept apart from `no_claude_subscription` so a funnel can split them. */
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts
CHANGED
|
@@ -3,23 +3,25 @@
|
|
|
3
3
|
* exiting, so a command can be asserted end to end without spawning a process.
|
|
4
4
|
*/
|
|
5
5
|
import { type ParsedArgs } from "./args.js";
|
|
6
|
-
import { type PathContext } from "./
|
|
6
|
+
import { type AgentDeps, type PathContext } from "./agents/types.js";
|
|
7
7
|
import { type PrecheckDeps } from "./precheck.js";
|
|
8
8
|
import { type PromptIo } from "./prompt.js";
|
|
9
9
|
import { type LoginDeps } from "./login/session.js";
|
|
10
10
|
import { type RunResult } from "./result.js";
|
|
11
11
|
import { type Telemetry } from "./telemetry/telemetry.js";
|
|
12
|
-
import { type
|
|
12
|
+
import { type StatusLine } from "./status.js";
|
|
13
13
|
/** Everything the dispatcher needs from the outside world, injected at the edge. */
|
|
14
14
|
export interface RunContext {
|
|
15
15
|
readonly paths: PathContext;
|
|
16
16
|
readonly prompt: PromptIo;
|
|
17
17
|
readonly processEnv: Record<string, string | undefined>;
|
|
18
|
-
readonly verify:
|
|
18
|
+
readonly verify: AgentDeps;
|
|
19
19
|
readonly precheck: PrecheckDeps;
|
|
20
20
|
readonly login: LoginDeps;
|
|
21
21
|
/** Progress output while `login` waits. Streams, so it cannot go in RunResult. */
|
|
22
22
|
readonly notify: (message: string) => void;
|
|
23
|
+
/** The redrawn "what is happening now" line. Absent means nothing is drawn. */
|
|
24
|
+
readonly status?: StatusLine | undefined;
|
|
23
25
|
/** Onboarding events. Never blocks or fails a command. */
|
|
24
26
|
readonly telemetry: Telemetry;
|
|
25
27
|
}
|
package/dist/router.js
CHANGED
|
@@ -3,20 +3,24 @@
|
|
|
3
3
|
* exiting, so a command can be asserted end to end without spawning a process.
|
|
4
4
|
*/
|
|
5
5
|
import { DEFAULT_URLS, containsControlCharacters } from "./args.js";
|
|
6
|
-
import { resolvePaths, shadowingLocalConfig, writeConfig
|
|
6
|
+
import { resolvePaths, shadowingLocalConfig, writeConfig } from "./agents/claude-code/settings.js";
|
|
7
|
+
import { AI21_KEY_PLACEHOLDER, } from "./agents/types.js";
|
|
7
8
|
import { precheckKey } from "./precheck.js";
|
|
8
|
-
import { EXIT_FOR, collectWarnings, nothingWasWritten, report, reportNoClaudeCli, reportNoClaudeCredential, reportRevert, } from "./report.js";
|
|
9
|
-
import { revertConfig } from "./revert.js";
|
|
9
|
+
import { EXIT_FOR, collectWarnings, nothingWasWritten, report, reportNoClaudeCli, reportNoClaudeCredential, reportRevert, reportSignedIn, } from "./report.js";
|
|
10
|
+
import { revertConfig } from "./agents/claude-code/revert.js";
|
|
10
11
|
import { keyName, mintApiKey } from "./login/apiKeys.js";
|
|
11
|
-
import { load as loadCredential, save as saveCredential } from "./login/credentials.js";
|
|
12
|
+
import { load as loadCredential, save as saveCredential, } from "./login/credentials.js";
|
|
12
13
|
import { runLogin } from "./login/session.js";
|
|
13
14
|
import { DeadCredentialError, exchangeRefreshToken } from "./login/tokens.js";
|
|
14
15
|
import { chooseWorkspace, fetchWorkspaces, workspaceOwningAgent } from "./login/workspaces.js";
|
|
15
16
|
import { EXIT } from "./result.js";
|
|
16
|
-
import {
|
|
17
|
+
import { ccSettings, ccSettingsEnv } from "./agents/claude-code/snippets.js";
|
|
17
18
|
import { readVersion } from "./cli.js";
|
|
18
|
-
import { restoreConfig, snapshotConfig } from "./snapshot.js";
|
|
19
|
-
import {
|
|
19
|
+
import { restoreConfig, snapshotConfig } from "./fs/snapshot.js";
|
|
20
|
+
import { findOnPath } from "./process.js";
|
|
21
|
+
import { checkClaudeLogin } from "./agents/claude-code/status.js";
|
|
22
|
+
import { CLAUDE_COMMAND, resolveAnthropicKey, verify, } from "./agents/claude-code/verify.js";
|
|
23
|
+
import { NO_STATUS } from "./status.js";
|
|
20
24
|
/* Identifies traffic this tool configured, so the gateway can tell a CLI-configured
|
|
21
25
|
* agent from a hand-pasted one without the CLI reporting anything.
|
|
22
26
|
*
|
|
@@ -113,6 +117,22 @@ function detailFor(outcome) {
|
|
|
113
117
|
function verifyCwd(args, ctx) {
|
|
114
118
|
return args.target === "user" ? ctx.paths.home : ctx.paths.cwd;
|
|
115
119
|
}
|
|
120
|
+
/** Says what is happening now. The line is overwritten by the next step and cleared before the result. */
|
|
121
|
+
function step(ctx, text) {
|
|
122
|
+
(ctx.status ?? NO_STATUS).update(text);
|
|
123
|
+
}
|
|
124
|
+
/** Keeps a step that definitely succeeded in the scrollback as a dim ✔ line. */
|
|
125
|
+
function finished(ctx, text) {
|
|
126
|
+
(ctx.status ?? NO_STATUS).done(text);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The browser handed the credential back. Said at once, with the bell, since the user's
|
|
130
|
+
* attention is in the browser and a terminal in the background shows the bell as a badge.
|
|
131
|
+
*/
|
|
132
|
+
function approvedInBrowser(ctx) {
|
|
133
|
+
finished(ctx, "Approved in the browser");
|
|
134
|
+
(ctx.status ?? NO_STATUS).bell();
|
|
135
|
+
}
|
|
116
136
|
/**
|
|
117
137
|
* Verification runs only once the config is actually on disk — there is nothing to
|
|
118
138
|
* verify after a refusal, and a request fired anyway would report on whatever
|
|
@@ -123,6 +143,7 @@ async function verifyWrite(args, ctx, outcome, inputs) {
|
|
|
123
143
|
return undefined;
|
|
124
144
|
if (args.noVerify)
|
|
125
145
|
return { kind: "disabled" };
|
|
146
|
+
step(ctx, "Verifying through the gateway…");
|
|
126
147
|
return verify({
|
|
127
148
|
urls: args.urls,
|
|
128
149
|
agentId: inputs.agentId,
|
|
@@ -147,8 +168,13 @@ async function verifyWrite(args, ctx, outcome, inputs) {
|
|
|
147
168
|
* proves it. `--no-verify` skips both, for installs with no Claude login yet by design.
|
|
148
169
|
*/
|
|
149
170
|
async function writeAndReport(args, ctx, inputs, precheck) {
|
|
150
|
-
const paths = resolvePaths(args.target, ctx.paths
|
|
151
|
-
if (!args.noVerify
|
|
171
|
+
const paths = resolvePaths(args.target, ctx.paths);
|
|
172
|
+
if (!args.noVerify)
|
|
173
|
+
step(ctx, "Checking your Claude login…");
|
|
174
|
+
const claudeLogin = args.noVerify ? undefined : await checkClaudeLogin(verifyCwd(args, ctx), ctx.verify);
|
|
175
|
+
if (claudeLogin === "logged-in")
|
|
176
|
+
finished(ctx, "Claude login found");
|
|
177
|
+
if (claudeLogin === "logged-out") {
|
|
152
178
|
const result = reportNoClaudeCredential({
|
|
153
179
|
path: paths.settings,
|
|
154
180
|
reason: "logged-out",
|
|
@@ -284,7 +310,7 @@ async function resolveKeyForInstall(args, ctx) {
|
|
|
284
310
|
err: "--key is required when stdin is not a terminal. Pass --key <key>.\n",
|
|
285
311
|
});
|
|
286
312
|
}
|
|
287
|
-
const outcome = await runLogin(args.urls, ctx.login,
|
|
313
|
+
const outcome = await runLogin(args.urls, ctx.login, loginProgress(ctx));
|
|
288
314
|
switch (outcome.kind) {
|
|
289
315
|
case "timeout":
|
|
290
316
|
return refuse("login", "sign-in timed out", {
|
|
@@ -305,6 +331,7 @@ async function resolveKeyForInstall(args, ctx) {
|
|
|
305
331
|
err: `Sign-in could not start: ${outcome.reason}.\n`,
|
|
306
332
|
});
|
|
307
333
|
case "credential": {
|
|
334
|
+
approvedInBrowser(ctx);
|
|
308
335
|
const session = await storeSession(args, ctx, outcome.credential);
|
|
309
336
|
// Its own message already says what failed and that nothing was written.
|
|
310
337
|
if (session.code !== EXIT.OK)
|
|
@@ -331,22 +358,29 @@ const AGENT_KIND = { "claude-code": "claude_code" };
|
|
|
331
358
|
* CliSetupCompleted or CliSetupFailed. Only a passed verification counts as completed.
|
|
332
359
|
*/
|
|
333
360
|
async function install(args, ctx) {
|
|
334
|
-
const setup = ctx.telemetry.startSetup("installAgent");
|
|
361
|
+
const setup = ctx.telemetry.startSetup("installAgent", storedSession(args, ctx)?.userId);
|
|
335
362
|
const { failure, ...result } = await installSteps(args, ctx);
|
|
336
|
-
// Read after the flow, because sign-in and re-homing can
|
|
337
|
-
|
|
363
|
+
// Read again after the flow, because sign-in and re-homing can change the user and workspace.
|
|
364
|
+
// With no signed-in user there is no one to attribute the setup to, so it is not reported.
|
|
365
|
+
const session = storedSession(args, ctx);
|
|
366
|
+
if (session === undefined)
|
|
367
|
+
return result;
|
|
368
|
+
const context = {
|
|
369
|
+
userId: session.userId,
|
|
370
|
+
agentKind: AGENT_KIND[args.client],
|
|
371
|
+
// A --key may belong to another workspace than the stored session's, so it names none.
|
|
372
|
+
workspaceId: args.key === undefined ? session.workspaceId : undefined,
|
|
373
|
+
};
|
|
338
374
|
if (failure === undefined)
|
|
339
375
|
setup.completed(context);
|
|
340
376
|
else
|
|
341
377
|
setup.failed(failure, context);
|
|
342
378
|
return result;
|
|
343
379
|
}
|
|
344
|
-
/**
|
|
345
|
-
function
|
|
346
|
-
if (args.key !== undefined)
|
|
347
|
-
return undefined;
|
|
380
|
+
/** This gateway's stored session, when there is one. Its user is the person running the CLI, even under --key. */
|
|
381
|
+
function storedSession(args, ctx) {
|
|
348
382
|
const stored = loadCredential(args.urls.gateway, credentialPaths(ctx));
|
|
349
|
-
return stored.kind === "credential" ? stored.credential
|
|
383
|
+
return stored.kind === "credential" ? stored.credential : undefined;
|
|
350
384
|
}
|
|
351
385
|
/**
|
|
352
386
|
* Claude Code is the only client, so with neither its CLI nor an Anthropic key to reach
|
|
@@ -383,14 +417,17 @@ async function installSteps(args, ctx) {
|
|
|
383
417
|
});
|
|
384
418
|
}
|
|
385
419
|
let key = resolved.key;
|
|
420
|
+
step(ctx, "Checking the AI21 key and agent…");
|
|
386
421
|
let outcome = await precheckKey({ agentsUrl: args.urls.agents, agentId: args.agentId ?? "", ai21Key: key }, ctx.precheck);
|
|
387
422
|
// A stored key sees only its own workspace's agents; mint one where this agent lives.
|
|
388
423
|
if (outcome.kind === "unknown-agent" && args.key === undefined) {
|
|
424
|
+
step(ctx, "Finding the workspace this agent belongs to…");
|
|
389
425
|
const moved = await rehomeStoredSession(args, ctx);
|
|
390
426
|
if (moved !== undefined) {
|
|
391
427
|
if (!("key" in moved))
|
|
392
428
|
return refuse("keyCheck", "stored session could not be moved to the agent's workspace", moved);
|
|
393
429
|
key = moved.key;
|
|
430
|
+
step(ctx, "Checking the AI21 key and agent…");
|
|
394
431
|
outcome = await precheckKey({ agentsUrl: args.urls.agents, agentId: args.agentId ?? "", ai21Key: key }, ctx.precheck);
|
|
395
432
|
}
|
|
396
433
|
}
|
|
@@ -404,6 +441,8 @@ async function installSteps(args, ctx) {
|
|
|
404
441
|
if (outcome.kind === "rejected") {
|
|
405
442
|
return refuse("keyCheck", "key rejected", { code: EXIT.USAGE, out: "", err: rejectedKeyMessage(args) }, outcome.status);
|
|
406
443
|
}
|
|
444
|
+
if (outcome.kind === "accepted")
|
|
445
|
+
finished(ctx, `AI21 key accepted for agent ${args.agentId ?? ""}`);
|
|
407
446
|
const { result, failure } = await writeAndReport(args, ctx, { ...snippetInputs(args), ai21Key: key }, outcome);
|
|
408
447
|
return failure === undefined ? result : { ...result, failure };
|
|
409
448
|
}
|
|
@@ -445,7 +484,7 @@ async function login(args, ctx) {
|
|
|
445
484
|
err: "`login` needs an interactive terminal. In CI, pass --key with an AI21 API key instead.\n",
|
|
446
485
|
};
|
|
447
486
|
}
|
|
448
|
-
const outcome = await runLogin(args.urls, ctx.login,
|
|
487
|
+
const outcome = await runLogin(args.urls, ctx.login, loginProgress(ctx));
|
|
449
488
|
switch (outcome.kind) {
|
|
450
489
|
case "timeout":
|
|
451
490
|
return {
|
|
@@ -462,6 +501,7 @@ async function login(args, ctx) {
|
|
|
462
501
|
case "failed":
|
|
463
502
|
return { code: EXIT.INTERNAL, out: "", err: `Login could not start: ${outcome.reason}.\n` };
|
|
464
503
|
case "credential":
|
|
504
|
+
approvedInBrowser(ctx);
|
|
465
505
|
return storeSession(args, ctx, outcome.credential);
|
|
466
506
|
}
|
|
467
507
|
}
|
|
@@ -472,6 +512,7 @@ async function login(args, ctx) {
|
|
|
472
512
|
* exchange ended with.
|
|
473
513
|
*/
|
|
474
514
|
async function storeSession(args, ctx, credential) {
|
|
515
|
+
step(ctx, "Finishing sign-in…");
|
|
475
516
|
let exchanged;
|
|
476
517
|
try {
|
|
477
518
|
exchanged = await exchangeRefreshToken(credential.refreshToken, credential.firebaseApiKey, ctx.login.fetchImpl);
|
|
@@ -489,6 +530,7 @@ async function storeSession(args, ctx, credential) {
|
|
|
489
530
|
: String(err)}\nNothing was stored. Try signing in again.\n`,
|
|
490
531
|
};
|
|
491
532
|
}
|
|
533
|
+
step(ctx, "Loading your workspaces…");
|
|
492
534
|
const available = await fetchWorkspaces(args.urls.gateway, exchanged.idToken, ctx.login.fetchImpl);
|
|
493
535
|
// `install --agent-id` needs the key where that agent lives; `--workspace` still wins.
|
|
494
536
|
const agentHome = args.workspaceId === undefined && args.agentId !== undefined
|
|
@@ -509,6 +551,7 @@ async function storeSession(args, ctx, credential) {
|
|
|
509
551
|
const existing = await storedKeyFor(args, ctx, credential.userId, chosen.id);
|
|
510
552
|
let ai21Key = existing;
|
|
511
553
|
if (ai21Key === undefined) {
|
|
554
|
+
step(ctx, `Creating an AI21 API key in ${chosen.name}…`);
|
|
512
555
|
const minted = await mintApiKey(args.urls.gateway, exchanged.idToken, chosen.id, keyName(), ctx.login.fetchImpl);
|
|
513
556
|
if (minted.kind === "failed") {
|
|
514
557
|
const stored = await persist(args, ctx, credential, exchanged.refreshToken, chosen.id, undefined);
|
|
@@ -521,15 +564,13 @@ async function storeSession(args, ctx, credential) {
|
|
|
521
564
|
};
|
|
522
565
|
}
|
|
523
566
|
ai21Key = minted.value;
|
|
567
|
+
finished(ctx, `Created an AI21 API key in ${chosen.name}`);
|
|
524
568
|
}
|
|
569
|
+
step(ctx, "Saving your session…");
|
|
525
570
|
const stored = await persist(args, ctx, credential, exchanged.refreshToken, chosen.id, ai21Key);
|
|
526
571
|
if (stored !== undefined)
|
|
527
572
|
return stored;
|
|
528
|
-
return
|
|
529
|
-
code: EXIT.OK,
|
|
530
|
-
out: `Signed in as ${credential.userEmail}.\n workspace: ${chosen.name}\n`,
|
|
531
|
-
err: "",
|
|
532
|
-
};
|
|
573
|
+
return reportSignedIn(credential.userEmail, chosen.name);
|
|
533
574
|
}
|
|
534
575
|
/**
|
|
535
576
|
* The stored key for this gateway, but only if the same user minted it in the same
|
|
@@ -587,12 +628,19 @@ function noWorkspaceMessage(args, available) {
|
|
|
587
628
|
`Yours: ${available.map((workspace) => workspace.id).join(", ")}\n` +
|
|
588
629
|
"No API key was created.\n");
|
|
589
630
|
}
|
|
631
|
+
/** The sign-in instructions stay in scrollback; the wait after them is a status step. */
|
|
632
|
+
function loginProgress(ctx) {
|
|
633
|
+
return {
|
|
634
|
+
notify: ctx.notify,
|
|
635
|
+
waiting: () => step(ctx, "Waiting for you to approve the sign-in in the browser…"),
|
|
636
|
+
};
|
|
637
|
+
}
|
|
590
638
|
function credentialPaths(ctx) {
|
|
591
639
|
return { home: ctx.paths.home, warn: ctx.notify };
|
|
592
640
|
}
|
|
593
641
|
/** `uninstall`: hand the resolved paths to the reverter and report what it did. */
|
|
594
642
|
function uninstall(args, ctx) {
|
|
595
|
-
const outcome = revertConfig(resolvePaths(args.target, ctx.paths
|
|
643
|
+
const outcome = revertConfig(resolvePaths(args.target, ctx.paths), {
|
|
596
644
|
fromBackup: args.fromBackup,
|
|
597
645
|
force: args.yes,
|
|
598
646
|
agentIdGuard: args.agentIdGuard,
|