@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.
Files changed (65) hide show
  1. package/README.md +5 -4
  2. package/dist/agents/claude-code/revert.d.ts +11 -0
  3. package/dist/{revert.js → agents/claude-code/revert.js} +2 -1
  4. package/dist/agents/claude-code/revert.js.map +1 -0
  5. package/dist/agents/claude-code/settings.d.ts +33 -0
  6. package/dist/{config.js → agents/claude-code/settings.js} +6 -57
  7. package/dist/agents/claude-code/settings.js.map +1 -0
  8. package/dist/{snippets.d.ts → agents/claude-code/snippets.d.ts} +1 -18
  9. package/dist/{snippets.js → agents/claude-code/snippets.js} +0 -19
  10. package/dist/agents/claude-code/snippets.js.map +1 -0
  11. package/dist/agents/claude-code/status.d.ts +12 -0
  12. package/dist/agents/claude-code/status.js +42 -0
  13. package/dist/agents/claude-code/status.js.map +1 -0
  14. package/dist/{verify.d.ts → agents/claude-code/verify.d.ts} +14 -54
  15. package/dist/{verify.js → agents/claude-code/verify.js} +2 -133
  16. package/dist/agents/claude-code/verify.js.map +1 -0
  17. package/dist/agents/deps.d.ts +3 -0
  18. package/dist/agents/deps.js +10 -0
  19. package/dist/agents/deps.js.map +1 -0
  20. package/dist/agents/types.d.ts +266 -0
  21. package/dist/agents/types.js +3 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/cli.js +23 -3
  24. package/dist/cli.js.map +1 -1
  25. package/dist/fs/safeFile.d.ts +19 -0
  26. package/dist/fs/safeFile.js +50 -0
  27. package/dist/fs/safeFile.js.map +1 -0
  28. package/dist/{snapshot.d.ts → fs/snapshot.d.ts} +1 -1
  29. package/dist/{snapshot.js → fs/snapshot.js} +1 -1
  30. package/dist/fs/snapshot.js.map +1 -0
  31. package/dist/login/keychain/linux.d.ts +1 -1
  32. package/dist/login/keychain/linux.js +1 -1
  33. package/dist/login/keychain/linux.js.map +1 -1
  34. package/dist/login/session.d.ts +12 -0
  35. package/dist/login/session.js +23 -5
  36. package/dist/login/session.js.map +1 -1
  37. package/dist/process.d.ts +26 -0
  38. package/dist/process.js +94 -0
  39. package/dist/process.js.map +1 -0
  40. package/dist/prompt.d.ts +5 -7
  41. package/dist/prompt.js +23 -1
  42. package/dist/prompt.js.map +1 -1
  43. package/dist/report.d.ts +5 -8
  44. package/dist/report.js +46 -17
  45. package/dist/report.js.map +1 -1
  46. package/dist/router.d.ts +5 -3
  47. package/dist/router.js +73 -25
  48. package/dist/router.js.map +1 -1
  49. package/dist/status.d.ts +31 -0
  50. package/dist/status.js +107 -0
  51. package/dist/status.js.map +1 -0
  52. package/dist/telemetry/amplitudeHttp.js +1 -0
  53. package/dist/telemetry/amplitudeHttp.js.map +1 -1
  54. package/dist/telemetry/events.d.ts +7 -3
  55. package/dist/telemetry/telemetry.d.ts +6 -2
  56. package/dist/telemetry/telemetry.js +19 -8
  57. package/dist/telemetry/telemetry.js.map +1 -1
  58. package/package.json +3 -3
  59. package/dist/config.d.ts +0 -83
  60. package/dist/config.js.map +0 -1
  61. package/dist/revert.d.ts +0 -60
  62. package/dist/revert.js.map +0 -1
  63. package/dist/snapshot.js.map +0 -1
  64. package/dist/snippets.js.map +0 -1
  65. package/dist/verify.js.map +0 -1
@@ -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
- export {};
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
@@ -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 "./config.js";
2
+ import type { ConfigOutcome, RevertOutcome, Warning } from "./agents/types.js";
3
3
  import type { PrecheckOutcome } from "./precheck.js";
4
- import type { RevertOutcome } from "./revert.js";
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 interface Warning {
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 ${outcome.path} — ${parts.join("; ")}`;
92
+ return `Reverted ${path} — ${parts.join("; ")}`;
81
93
  }
82
94
  case "restored":
83
- return `Restored ${outcome.path} from ${outcome.backup}`;
95
+ return `Restored ${path} from ${outcome.backup}`;
84
96
  case "not-configured":
85
- return `Nothing to revert — ${outcome.path} does not carry this tool's settings.`;
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 format = outcome.kind === "not-configured" ? "yellow" : ok ? "green" : "red";
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(format, revertLine(outcome))}\n${revertDetail(outcome, 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 ${outcome.path}`;
195
+ return `Wrote ${path}`;
183
196
  case "updated":
184
- return `Updated ${outcome.path} (${outcome.changed.join(", ")})\nBacked up the previous file to ${outcome.backup}`;
197
+ return `Updated ${path} (${outcome.changed.join(", ")})`;
185
198
  case "unchanged":
186
- return `Already configured — ${outcome.path} is up to date.`;
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]}.\n`;
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("yellow", "warning:")} ${w.message}\n`).join("");
294
- const line = paintBody(ok ? "green" : "red", humanLine(input.outcome));
295
- const body = `${line}\n${verificationLine(input.verification)}${input.detail ?? ""}`;
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 headline = painterFor(streams.err)("red", NO_CREDENTIAL_HEADLINE[input.reason]);
363
+ const title = headline(painterFor(streams.err), "red", NO_CREDENTIAL_HEADLINE[input.reason]);
344
364
  return {
345
365
  code,
346
366
  out: "",
347
- err: `${headline} ${NO_CREDENTIAL_NEXT_STEP[input.reason]}\n${noCredentialStateLine(input, streams)}\n`,
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. */
@@ -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 "./config.js";
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 VerifyDeps } from "./verify.js";
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: VerifyDeps;
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, } from "./config.js";
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 { AI21_KEY_PLACEHOLDER, ccSettings, ccSettingsEnv } from "./snippets.js";
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 { CLAUDE_COMMAND, checkClaudeLogin, findOnPath, resolveAnthropicKey, verify, } from "./verify.js";
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, args.client);
151
- if (!args.noVerify && (await checkClaudeLogin(verifyCwd(args, ctx), ctx.verify)) === "logged-out") {
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, { notify: ctx.notify });
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 both change the workspace.
337
- const context = { agentKind: AGENT_KIND[args.client], workspaceId: storedWorkspace(args, ctx) };
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
- /** The workspace of this gateway's stored session, when there is one. `--key` alone names none. */
345
- function storedWorkspace(args, ctx) {
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.workspaceId : undefined;
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, { notify: ctx.notify });
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, args.client), {
643
+ const outcome = revertConfig(resolvePaths(args.target, ctx.paths), {
596
644
  fromBackup: args.fromBackup,
597
645
  force: args.yes,
598
646
  agentIdGuard: args.agentIdGuard,