@ai21/gateway 0.5.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +44 -13
  2. package/dist/args.d.ts +4 -2
  3. package/dist/args.js +18 -7
  4. package/dist/args.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +48 -8
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +6 -1
  9. package/dist/config.js +19 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/login/apiKeys.d.ts +20 -0
  12. package/dist/login/apiKeys.js +75 -0
  13. package/dist/login/apiKeys.js.map +1 -0
  14. package/dist/login/credentials.d.ts +21 -8
  15. package/dist/login/credentials.js +149 -41
  16. package/dist/login/credentials.js.map +1 -1
  17. package/dist/login/fileAcl.d.ts +29 -0
  18. package/dist/login/fileAcl.js +129 -0
  19. package/dist/login/fileAcl.js.map +1 -0
  20. package/dist/login/keychain/linux.d.ts +28 -0
  21. package/dist/login/keychain/linux.js +57 -0
  22. package/dist/login/keychain/linux.js.map +1 -0
  23. package/dist/login/keychain/macos.d.ts +30 -0
  24. package/dist/login/keychain/macos.js +52 -0
  25. package/dist/login/keychain/macos.js.map +1 -0
  26. package/dist/login/keychain/runner.d.ts +30 -0
  27. package/dist/login/keychain/runner.js +88 -0
  28. package/dist/login/keychain/runner.js.map +1 -0
  29. package/dist/login/keychain/select.d.ts +14 -0
  30. package/dist/login/keychain/select.js +74 -0
  31. package/dist/login/keychain/select.js.map +1 -0
  32. package/dist/login/lock.d.ts +16 -0
  33. package/dist/login/lock.js +139 -0
  34. package/dist/login/lock.js.map +1 -0
  35. package/dist/login/secretStore.d.ts +21 -0
  36. package/dist/login/secretStore.js +12 -0
  37. package/dist/login/secretStore.js.map +1 -0
  38. package/dist/login/session.d.ts +3 -0
  39. package/dist/login/session.js.map +1 -1
  40. package/dist/login/workspaces.d.ts +18 -1
  41. package/dist/login/workspaces.js +46 -2
  42. package/dist/login/workspaces.js.map +1 -1
  43. package/dist/precheck.d.ts +46 -0
  44. package/dist/precheck.js +86 -0
  45. package/dist/precheck.js.map +1 -0
  46. package/dist/prompt.d.ts +4 -19
  47. package/dist/prompt.js +1 -71
  48. package/dist/prompt.js.map +1 -1
  49. package/dist/report.d.ts +22 -9
  50. package/dist/report.js +97 -13
  51. package/dist/report.js.map +1 -1
  52. package/dist/result.d.ts +2 -0
  53. package/dist/result.js +2 -0
  54. package/dist/result.js.map +1 -1
  55. package/dist/router.d.ts +2 -0
  56. package/dist/router.js +246 -71
  57. package/dist/router.js.map +1 -1
  58. package/dist/verify.d.ts +1 -0
  59. package/dist/verify.js +1 -1
  60. package/dist/verify.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Checks a pasted AI21 key before anything is written, with a GET on the agents
3
+ * endpoint. Only a positively identified rejection stops a write: there is no flag to
4
+ * bypass this, so anything we cannot read has to fall through and let the write happen.
5
+ */
6
+ export const PRECHECK_TIMEOUT_MS = 10_000;
7
+ /** Nothing else is a rejection: a 5xx means the service is unwell, not that the key is bad. */
8
+ const REJECTION_STATUSES = new Set([400, 401, 403]);
9
+ function isLoopbackHost(hostname) {
10
+ return hostname === "127.0.0.1" || hostname === "localhost" || hostname === "::1" || hostname === "[::1]";
11
+ }
12
+ /** Off-box plain http would put the key on the wire in the clear. */
13
+ function isInsecure(url) {
14
+ try {
15
+ const { protocol, hostname } = new URL(url);
16
+ return protocol === "http:" && !isLoopbackHost(hostname);
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /** `undefined` for an unreadable body, distinct from `[]` — a key with no agents. */
23
+ function agentIdsIn(body) {
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(body);
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ if (!Array.isArray(parsed))
32
+ return undefined;
33
+ const ids = [];
34
+ for (const entry of parsed) {
35
+ if (typeof entry !== "object" || entry === null)
36
+ return undefined;
37
+ // `agent_id` is what `--agent-id` names; `id` is the row's UUID.
38
+ const id = entry["agent_id"];
39
+ if (typeof id !== "string")
40
+ return undefined;
41
+ ids.push(id);
42
+ }
43
+ return ids;
44
+ }
45
+ /** Reasons carry no key and end without a full stop — `report.ts` punctuates. */
46
+ export async function precheckKey(ctx, deps) {
47
+ if (isInsecure(ctx.agentsUrl)) {
48
+ return { kind: "skipped", reason: "the gateway is plain http, so the key was not sent to be checked" };
49
+ }
50
+ let response;
51
+ try {
52
+ response = await deps.fetchImpl(ctx.agentsUrl, {
53
+ method: "GET",
54
+ // Not X-AI21-Key: the api-server reads that only on /gateway/v1, and answers 400 here.
55
+ headers: { "X-API-Key": ctx.ai21Key },
56
+ signal: AbortSignal.timeout(PRECHECK_TIMEOUT_MS),
57
+ });
58
+ }
59
+ catch (err) {
60
+ // Named rather than quoted: the cause can carry an internal hostname.
61
+ return {
62
+ kind: "inconclusive",
63
+ reason: isAbort(err)
64
+ ? `the gateway did not answer within ${PRECHECK_TIMEOUT_MS / 1000}s`
65
+ : "the gateway could not be reached",
66
+ };
67
+ }
68
+ if (!response.ok) {
69
+ return REJECTION_STATUSES.has(response.status)
70
+ ? { kind: "rejected", reason: "the gateway rejected it" }
71
+ : { kind: "inconclusive", reason: `the gateway answered ${response.status}` };
72
+ }
73
+ const ids = agentIdsIn((await response.text?.()) ?? "");
74
+ if (ids === undefined) {
75
+ return { kind: "inconclusive", reason: "the gateway's answer could not be read" };
76
+ }
77
+ return ids.includes(ctx.agentId) ? { kind: "accepted" } : { kind: "unknown-agent", known: ids };
78
+ }
79
+ function isAbort(err) {
80
+ return err instanceof Error && (err.name === "AbortError" || err.name === "TimeoutError");
81
+ }
82
+ /** The real-world adapter, kept here so `cli.ts` stays a thin edge. */
83
+ export function nodePrecheckDeps() {
84
+ return { fetchImpl: fetch };
85
+ }
86
+ //# sourceMappingURL=precheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precheck.js","sourceRoot":"","sources":["../src/precheck.ts"],"names":[],"mappings":"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"}
package/dist/prompt.d.ts CHANGED
@@ -1,20 +1,11 @@
1
1
  /**
2
- * Reading the AI21 key from the terminal when `--key` was not given.
2
+ * The terminal the CLI was run from.
3
3
  *
4
- * Two properties matter: the key is never echoed — the whole reason for prompting
5
- * rather than taking a flag — and a non-interactive run fails immediately instead
6
- * of blocking on a stdin that will never deliver a line.
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
7
  */
8
8
  import type { Readable, Writable } from "node:stream";
9
- /** How the prompt ended. `cancelled` covers Ctrl-C and a closed stdin. */
10
- export type PromptOutcome = {
11
- readonly kind: "key";
12
- readonly value: string;
13
- } | {
14
- readonly kind: "no-tty";
15
- } | {
16
- readonly kind: "cancelled";
17
- };
18
9
  export interface PromptIo {
19
10
  readonly input: Readable & {
20
11
  isTTY?: boolean;
@@ -24,9 +15,3 @@ export interface PromptIo {
24
15
  /** Overrides the stream's own flag; tests drive a pipe as though it were a tty. */
25
16
  readonly isTTY?: boolean;
26
17
  }
27
- /**
28
- * Reads one line without echoing it. Raw mode is what makes that possible, and is
29
- * restored on every exit path — a terminal left in raw mode makes the user's next
30
- * command invisible.
31
- */
32
- export declare function promptForKey(io: PromptIo, label?: string): Promise<PromptOutcome>;
package/dist/prompt.js CHANGED
@@ -1,72 +1,2 @@
1
- const ETX = "\u0003"; // Ctrl-C
2
- const EOT = "\u0004"; // Ctrl-D
3
- // eslint-disable-next-line no-control-regex
4
- const BACKSPACE = /[\u0008\u007F]/;
5
- // C0 controls minus the ones handled above, plus DEL.
6
- // eslint-disable-next-line no-control-regex
7
- const OTHER_CONTROL = /[\u0000-\u001F\u007F]/;
8
- /**
9
- * Reads one line without echoing it. Raw mode is what makes that possible, and is
10
- * restored on every exit path — a terminal left in raw mode makes the user's next
11
- * command invisible.
12
- */
13
- export function promptForKey(io, label = "AI21 key: ") {
14
- const interactive = io.isTTY ?? io.input.isTTY ?? false;
15
- if (!interactive) {
16
- return Promise.resolve({ kind: "no-tty" });
17
- }
18
- return new Promise((resolve) => {
19
- let buffer = "";
20
- let settled = false;
21
- const restore = () => {
22
- io.input.setRawMode?.(false);
23
- io.input.pause();
24
- io.input.off("data", onData);
25
- io.input.off("end", onEnd);
26
- io.input.off("close", onEnd);
27
- };
28
- // Ctrl-D arrives as a byte, but a stream that simply ends delivers none. Without
29
- // this the promise never settles and the CLI wedges.
30
- function onEnd() {
31
- finish({ kind: "cancelled" });
32
- }
33
- const finish = (outcome) => {
34
- if (settled)
35
- return;
36
- settled = true;
37
- restore();
38
- // The newline the user's Enter did not produce, because it was swallowed.
39
- io.output.write("\n");
40
- resolve(outcome);
41
- };
42
- function onData(chunk) {
43
- for (const char of chunk.toString("utf8")) {
44
- if (char === "\r" || char === "\n") {
45
- finish({ kind: "key", value: buffer });
46
- return;
47
- }
48
- if (char === ETX || char === EOT) {
49
- finish({ kind: "cancelled" });
50
- return;
51
- }
52
- if (BACKSPACE.test(char)) {
53
- buffer = buffer.slice(0, -1);
54
- continue;
55
- }
56
- // Arrow keys arrive as escape sequences and would corrupt the key. The flag
57
- // path rejects the same characters, so accepting them here is a second way in.
58
- if (OTHER_CONTROL.test(char))
59
- continue;
60
- // Unechoed, and no mask characters either: a visible length is information.
61
- buffer += char;
62
- }
63
- }
64
- io.output.write(label);
65
- io.input.setRawMode?.(true);
66
- io.input.resume();
67
- io.input.on("data", onData);
68
- io.input.once("end", onEnd);
69
- io.input.once("close", onEnd);
70
- });
71
- }
1
+ export {};
72
2
  //# sourceMappingURL=prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":""}
package/dist/report.d.ts CHANGED
@@ -1,12 +1,6 @@
1
- /**
2
- * Turning an outcome into output: human text on the right stream, or exactly one
3
- * JSON object, plus the warnings that apply either way.
4
- *
5
- * Two rules hold everywhere here. The key never appears, in any line. And `--json`
6
- * emits a single object, since a consumer parses the whole of stdout.
7
- */
8
1
  import type { ResolvedUrls } from "./args.js";
9
2
  import type { ConfigOutcome } from "./config.js";
3
+ import type { PrecheckOutcome } from "./precheck.js";
10
4
  import type { RevertOutcome } from "./revert.js";
11
5
  import type { VerifyOutcome } from "./verify.js";
12
6
  import { type RunResult } from "./result.js";
@@ -21,16 +15,31 @@ export declare const EXIT_FOR: Record<ConfigOutcome["kind"], number>;
21
15
  * "not-there" cases get their own codes so a script can tell them apart.
22
16
  */
23
17
  export declare const EXIT_FOR_REVERT: Record<RevertOutcome["kind"], number>;
24
- export declare function reportRevert(outcome: RevertOutcome, json: boolean): RunResult;
18
+ /** A write stream, narrowed to the one question asked of it. A pipe has no `hasColors`. */
19
+ export interface ColorTarget {
20
+ readonly hasColors?: () => boolean;
21
+ }
22
+ /** Where this report's two halves are bound for; injected so tests need no tty. */
23
+ export interface ColorTargets {
24
+ readonly out: ColorTarget;
25
+ readonly err: ColorTarget;
26
+ }
27
+ /** `NOTHING_WRITTEN`, painted for stderr — the stream every refusal that says it lands on. */
28
+ export declare function nothingWasWritten(streams?: ColorTargets): string;
29
+ export declare function reportRevert(outcome: RevertOutcome, json: boolean, streams?: ColorTargets): RunResult;
25
30
  export interface Warning {
26
31
  /** Stable identifier, so `--json` consumers match on this and not on prose. */
27
- readonly code: "anthropic-api-key-set" | "non-production-gateway" | "insecure-gateway" | "verification-skipped" | "verification-failed";
32
+ readonly code: "anthropic-api-key-set" | "shadowed-by-local-config" | "non-production-gateway" | "insecure-gateway" | "verification-skipped" | "verification-failed" | "key-check-inconclusive";
28
33
  readonly message: string;
29
34
  }
30
35
  export interface WarningContext {
31
36
  readonly urls: ResolvedUrls;
32
37
  /** The process environment, injected so tests need not mutate the real one. */
33
38
  readonly processEnv: Record<string, string | undefined>;
39
+ readonly localOverride?: {
40
+ readonly path: string;
41
+ readonly agentId?: string;
42
+ } | undefined;
34
43
  }
35
44
  /**
36
45
  * Not failures, but things that make a correct config look broken later — which is
@@ -46,5 +55,9 @@ export interface ReportInput {
46
55
  readonly urls: ResolvedUrls;
47
56
  /** Absent when the write never succeeded, so verification was not attempted. */
48
57
  readonly verification?: VerifyOutcome | undefined;
58
+ /** How the pre-write key check ended. Only the outcomes that permit a write reach here. */
59
+ readonly precheck?: PrecheckOutcome | undefined;
60
+ /** Colour destinations; defaults to the real process streams. Injected in tests. */
61
+ readonly streams?: ColorTargets | undefined;
49
62
  }
50
63
  export declare function report(input: ReportInput): RunResult;
package/dist/report.js CHANGED
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Turning an outcome into output: human text on the right stream, or exactly one
3
+ * JSON object, plus the warnings that apply either way.
4
+ *
5
+ * Three rules hold everywhere here. The key never appears, in any line. `--json`
6
+ * emits a single object, since a consumer parses the whole of stdout. And colour is
7
+ * decoration only: every styled string is byte-identical to the old one once the
8
+ * destination turns out not to be a terminal, which is what keeps `--json`, piped
9
+ * output and the existing output assertions unaffected.
10
+ */
11
+ import { styleText } from "node:util";
1
12
  import { DEFAULT_URLS, isInsecureGateway } from "./args.js";
2
13
  import { EXIT } from "./result.js";
3
14
  /**
@@ -27,6 +38,38 @@ export const EXIT_FOR_REVERT = {
27
38
  malformed: EXIT.MALFORMED,
28
39
  failed: EXIT.INTERNAL,
29
40
  };
41
+ const PROCESS_STREAMS = { out: process.stdout, err: process.stderr };
42
+ const PLAIN = (_format, text) => text;
43
+ /**
44
+ * Colour belongs to the stream the text lands on, not to the process, so each
45
+ * destination is asked about itself: `install > out.txt` has to keep escapes out of
46
+ * the file while the warnings still arrive coloured on the terminal.
47
+ *
48
+ * `hasColors()` makes the decision because it is the portable half — it exists on
49
+ * every Node this package supports and already honours NO_COLOR, FORCE_COLOR,
50
+ * NODE_DISABLE_COLORS and TERM=dumb. `styleText` is then told not to repeat the
51
+ * check: its own default interrogates `process.stdout` whichever stream the text is
52
+ * actually headed for, which would drop colour from stderr whenever stdout is piped.
53
+ * That option is ignored by Node 20.12–20.17, which did no validating anyway.
54
+ */
55
+ function painterFor(target) {
56
+ if (target.hasColors?.() !== true)
57
+ return PLAIN;
58
+ return (format, text) => styleText(format, text, { validateStream: false });
59
+ }
60
+ /**
61
+ * The sentence a refusal exists to deliver: it answers the only question a refusal
62
+ * raises — what happened to my file? — so it is painted like a `warning:` label
63
+ * instead of being left to the body prose, and like that label it is the only
64
+ * coloured part of its sentence.
65
+ *
66
+ * Yellow rather than red because nothing went wrong with the file: it is untouched.
67
+ */
68
+ const NOTHING_WRITTEN = "Nothing was written.";
69
+ /** `NOTHING_WRITTEN`, painted for stderr — the stream every refusal that says it lands on. */
70
+ export function nothingWasWritten(streams = PROCESS_STREAMS) {
71
+ return painterFor(streams.err)("yellow", NOTHING_WRITTEN);
72
+ }
30
73
  function revertLine(outcome) {
31
74
  switch (outcome.kind) {
32
75
  case "reverted": {
@@ -53,7 +96,7 @@ function revertLine(outcome) {
53
96
  }
54
97
  }
55
98
  /** Human-only detail: what the user can do about a refusal. */
56
- function revertDetail(outcome) {
99
+ function revertDetail(outcome, paint) {
57
100
  switch (outcome.kind) {
58
101
  case "reverted":
59
102
  // Said out loud because it is a silent partial failure otherwise: the keys
@@ -62,29 +105,34 @@ function revertDetail(outcome) {
62
105
  ? `The backup could not be read, so any values these keys held before could not be restored.\n`
63
106
  : "";
64
107
  case "drifted":
65
- return ("Restoring the backup would discard those changes. Nothing was written.\n" +
108
+ return (`Restoring the backup would discard those changes. ${paint("yellow", NOTHING_WRITTEN)}\n` +
66
109
  "Re-run with --yes to restore anyway, or without --from-backup to remove only this tool's keys.\n");
67
110
  case "agent-mismatch":
68
- return "Nothing was written. Re-run without --agent-id to revert whatever is there.\n";
111
+ return `${paint("yellow", NOTHING_WRITTEN)} Re-run without --agent-id to revert whatever is there.\n`;
69
112
  case "no-backup":
70
113
  return "Re-run without --from-backup to remove only this tool's keys.\n";
71
114
  case "malformed":
72
- return "Nothing was written. Fix or move the file, then re-run.\n";
115
+ return `${paint("yellow", NOTHING_WRITTEN)} Fix or move the file, then re-run.\n`;
73
116
  case "failed":
74
117
  return "The existing file was left unchanged.\n";
75
118
  default:
76
119
  return "";
77
120
  }
78
121
  }
79
- export function reportRevert(outcome, json) {
122
+ export function reportRevert(outcome, json, streams = PROCESS_STREAMS) {
80
123
  const code = EXIT_FOR_REVERT[outcome.kind];
81
124
  if (json) {
82
125
  const { kind, path, ...rest } = outcome;
83
126
  const payload = { ok: code === EXIT.OK, outcome: kind, exitCode: code, path, ...rest };
84
127
  return { code, out: `${JSON.stringify(payload, null, 2)}\n`, err: "" };
85
128
  }
86
- const body = `${revertLine(outcome)}\n${revertDetail(outcome)}`;
87
- return code === EXIT.OK ? { code, out: body, err: "" } : { code, out: "", err: body };
129
+ const ok = code === EXIT.OK;
130
+ // Colour tracks the exit code, with one exception: `not-configured` is a state,
131
+ // not a refusal, and painting "nothing to revert" red reads like a crash.
132
+ const format = outcome.kind === "not-configured" ? "yellow" : ok ? "green" : "red";
133
+ const paint = painterFor(ok ? streams.out : streams.err);
134
+ const body = `${paint(format, revertLine(outcome))}\n${revertDetail(outcome, paint)}`;
135
+ return ok ? { code, out: body, err: "" } : { code, out: "", err: body };
88
136
  }
89
137
  /**
90
138
  * Not failures, but things that make a correct config look broken later — which is
@@ -100,6 +148,17 @@ export function collectWarnings(ctx) {
100
148
  message: "ANTHROPIC_API_KEY is set in your environment. It overrides the credential Claude Code manages and can cause 401s through the gateway — unset it if requests start failing.",
101
149
  });
102
150
  }
151
+ if (ctx.localOverride !== undefined) {
152
+ const { path, agentId } = ctx.localOverride;
153
+ warnings.push({
154
+ code: "shadowed-by-local-config",
155
+ message: `${path} also sets Claude Code's env, and it is read after this file — so it wins. ` +
156
+ (agentId === undefined
157
+ ? "Requests will not use the agent configured here."
158
+ : `Requests will report as '${agentId}', not the agent configured here.`) +
159
+ " Remove its env block, or move your override into this file.",
160
+ });
161
+ }
103
162
  if (isInsecureGateway(ctx.urls.gateway)) {
104
163
  warnings.push({
105
164
  code: "insecure-gateway",
@@ -159,6 +218,15 @@ function verificationWarning(outcome) {
159
218
  return undefined;
160
219
  }
161
220
  }
221
+ /** Only outcomes that permitted the write reach here; a rejection never gets this far. */
222
+ function precheckWarning(outcome) {
223
+ if (outcome.kind !== "inconclusive" && outcome.kind !== "skipped")
224
+ return undefined;
225
+ return {
226
+ code: "key-check-inconclusive",
227
+ message: `The AI21 key could not be checked before writing — ${outcome.reason}. The configuration was written; if requests fail, the key is the first thing to check.`,
228
+ };
229
+ }
162
230
  /** The stdout line for a successful verification; nothing for any other outcome. */
163
231
  function verificationLine(outcome) {
164
232
  if (outcome?.kind !== "passed")
@@ -185,6 +253,11 @@ function jsonPayload(input, code, warnings) {
185
253
  const { kind, ...rest } = input.verification;
186
254
  payload.verification = { status: kind, ...rest };
187
255
  }
256
+ // Same contract as `verification`: checked or not, without matching on prose.
257
+ if (input.precheck !== undefined) {
258
+ const { kind, ...rest } = input.precheck;
259
+ payload.keyCheck = { status: kind, ...rest };
260
+ }
188
261
  if (outcome.kind === "updated") {
189
262
  payload.changed = outcome.changed;
190
263
  payload.backup = outcome.backup;
@@ -199,16 +272,27 @@ function jsonPayload(input, code, warnings) {
199
272
  }
200
273
  export function report(input) {
201
274
  const code = EXIT_FOR[input.outcome.kind];
202
- const fromVerification = input.verification === undefined ? undefined : verificationWarning(input.verification);
203
- const warnings = fromVerification === undefined ? input.warnings : [...input.warnings, fromVerification];
275
+ const derived = [
276
+ input.verification === undefined ? undefined : verificationWarning(input.verification),
277
+ input.precheck === undefined ? undefined : precheckWarning(input.precheck),
278
+ ].filter((warning) => warning !== undefined);
279
+ const warnings = [...input.warnings, ...derived];
204
280
  if (input.json) {
205
281
  // Everything on stdout, nothing on stderr: a single parse of one stream.
206
282
  return { code, out: jsonPayload(input, code, warnings), err: "" };
207
283
  }
208
- const warningText = warnings.map((w) => `warning: ${w.message}\n`).join("");
209
- const body = `${humanLine(input.outcome)}\n${verificationLine(input.verification)}${input.detail ?? ""}`;
210
284
  // Success narrates on stdout; a refusal belongs on stderr so `>/dev/null`
211
- // still shows the user why nothing happened.
212
- return code === EXIT.OK ? { code, out: body, err: warningText } : { code, out: "", err: `${body}${warningText}` };
285
+ // still shows the user why nothing happened. Each half is painted for the stream
286
+ // it will actually be written to, and warnings are always stderr-bound.
287
+ const ok = code === EXIT.OK;
288
+ const streams = input.streams ?? PROCESS_STREAMS;
289
+ const paintBody = painterFor(ok ? streams.out : streams.err);
290
+ const paintWarning = painterFor(streams.err);
291
+ // Only the label is coloured: the message is prose, and a paragraph of yellow is
292
+ // 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 ?? ""}`;
296
+ return ok ? { code, out: body, err: warningText } : { code, out: "", err: `${body}${warningText}` };
213
297
  }
214
298
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA0C;IAC7D,OAAO,EAAE,IAAI,CAAC,EAAE;IAChB,OAAO,EAAE,IAAI,CAAC,EAAE;IAChB,SAAS,EAAE,IAAI,CAAC,EAAE;IAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;IACvB,SAAS,EAAE,IAAI,CAAC,SAAS;IACzB,MAAM,EAAE,IAAI,CAAC,QAAQ;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAA0C;IACpE,QAAQ,EAAE,IAAI,CAAC,EAAE;IACjB,QAAQ,EAAE,IAAI,CAAC,EAAE;IACjB,gBAAgB,EAAE,IAAI,CAAC,cAAc;IACrC,gBAAgB,EAAE,IAAI,CAAC,QAAQ;IAC/B,OAAO,EAAE,IAAI,CAAC,QAAQ;IACtB,WAAW,EAAE,IAAI,CAAC,SAAS;IAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;IACzB,MAAM,EAAE,IAAI,CAAC,QAAQ;CACtB,CAAC;AAEF,SAAS,UAAU,CAAC,OAAsB;IACxC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG;gBACZ,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;gBACtG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;aACjF,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAEvD,OAAO,YAAY,OAAO,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,KAAK,UAAU;YACb,OAAO,YAAY,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3D,KAAK,gBAAgB;YACnB,OAAO,uBAAuB,OAAO,CAAC,IAAI,uCAAuC,CAAC;QACpF,KAAK,gBAAgB;YACnB,OAAO,GAAG,OAAO,CAAC,IAAI,6BAA6B,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,QAAQ,IAAI,CAAC;QACnG,KAAK,SAAS;YACZ,OAAO,GAAG,OAAO,CAAC,IAAI,oCAAoC,CAAC;QAC7D,KAAK,WAAW;YACd,OAAO,8BAA8B,OAAO,CAAC,MAAM,kBAAkB,CAAC;QACxE,KAAK,WAAW;YACd,OAAO,oBAAoB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;QAChE,KAAK,QAAQ;YACX,OAAO,oBAAoB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;IAClE,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,YAAY,CAAC,OAAsB;IAC1C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,UAAU;YACb,2EAA2E;YAC3E,qEAAqE;YACrE,OAAO,OAAO,CAAC,gBAAgB;gBAC7B,CAAC,CAAC,6FAA6F;gBAC/F,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,CACL,0EAA0E;gBAC1E,kGAAkG,CACnG,CAAC;QACJ,KAAK,gBAAgB;YACnB,OAAO,+EAA+E,CAAC;QACzF,KAAK,WAAW;YACd,OAAO,iEAAiE,CAAC;QAC3E,KAAK,WAAW;YACd,OAAO,2DAA2D,CAAC;QACrE,KAAK,QAAQ;YACX,OAAO,yCAAyC,CAAC;QACnD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAsB,EAAE,IAAa;IAChE,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACxC,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QAEvF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IAEhE,OAAO,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACxF,CAAC;AAmBD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAmB;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,KAAK,EAAE,EAAE,CAAC;QAC9F,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,uBAAuB;YAC7B,yEAAyE;YACzE,wEAAwE;YACxE,OAAO,EACL,4KAA4K;SAC/K,CAAC,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,0EAA0E;YAC1E,0EAA0E;YAC1E,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,sIAAsI;SACnK,CAAC,CAAC;IACL,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,wCAAwC,GAAG,CAAC,IAAI,CAAC,OAAO,oBAAoB;SACtF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wEAAwE;AACxE,SAAS,SAAS,CAAC,OAAsB;IACvC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,WAAW,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrH,KAAK,WAAW;YACd,OAAO,wBAAwB,OAAO,CAAC,IAAI,iBAAiB,CAAC;QAC/D,KAAK,UAAU;YACb,OAAO,GAAG,OAAO,CAAC,IAAI,iDAAiD,CAAC;QAC1E,KAAK,WAAW;YACd,OAAO,oBAAoB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;QAChE,KAAK,QAAQ;YACX,OAAO,mBAAmB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;IACjE,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,YAAY,GAAG;IACnB,YAAY,EAAE,aAAa;IAC3B,aAAa,EAAE,kBAAkB;CACzB,CAAC;AAEX;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,OAAsB;IACjD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,iEAAiE,OAAO,CAAC,IAAI,EAAE;aACzF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,0CAA0C,OAAO,CAAC,MAAM,oDAAoD;aACtH,CAAC;QACJ;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,gBAAgB,CAAC,OAAkC;IAC1D,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,qCAAqC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7E,CAAC;AAaD;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAkB,EAAE,IAAY,EAAE,QAA4B;IACjF,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,OAAO,GAA4B;QACvC,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;QAC3B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KACtE,CAAC;IAEF,kFAAkF;IAClF,2DAA2D;IAC3D,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;QAC7C,OAAO,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAClC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChH,MAAM,QAAQ,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEzG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,yEAAyE;QACzE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IAEzG,0EAA0E;IAC1E,6CAA6C;IAC7C,OAAO,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,WAAW,EAAE,EAAE,CAAC;AACpH,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
package/dist/result.d.ts CHANGED
@@ -18,6 +18,8 @@ export declare const EXIT: {
18
18
  readonly NO_BACKUP: 6;
19
19
  /** `login` did not complete: timed out, or the response was refused. */
20
20
  readonly LOGIN_INCOMPLETE: 7;
21
+ /** `login` found no workspace to mint a key in after filtering. */
22
+ readonly NO_WORKSPACE: 8;
21
23
  };
22
24
  export interface RunResult {
23
25
  readonly code: number;
package/dist/result.js CHANGED
@@ -18,5 +18,7 @@ export const EXIT = {
18
18
  NO_BACKUP: 6,
19
19
  /** `login` did not complete: timed out, or the response was refused. */
20
20
  LOGIN_INCOMPLETE: 7,
21
+ /** `login` found no workspace to mint a key in after filtering. */
22
+ NO_WORKSPACE: 8,
21
23
  };
22
24
  //# sourceMappingURL=result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,uEAAuE;IACvE,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,+EAA+E;IAC/E,QAAQ,EAAE,CAAC;IACX,gFAAgF;IAChF,SAAS,EAAE,CAAC;IACZ,wFAAwF;IACxF,cAAc,EAAE,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,CAAC;IACZ,wEAAwE;IACxE,gBAAgB,EAAE,CAAC;CACX,CAAC"}
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,uEAAuE;IACvE,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,+EAA+E;IAC/E,QAAQ,EAAE,CAAC;IACX,gFAAgF;IAChF,SAAS,EAAE,CAAC;IACZ,wFAAwF;IACxF,cAAc,EAAE,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,CAAC;IACZ,wEAAwE;IACxE,gBAAgB,EAAE,CAAC;IACnB,mEAAmE;IACnE,YAAY,EAAE,CAAC;CACP,CAAC"}
package/dist/router.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { type ParsedArgs } from "./args.js";
6
6
  import { type PathContext } from "./config.js";
7
+ import { type PrecheckDeps } from "./precheck.js";
7
8
  import { type PromptIo } from "./prompt.js";
8
9
  import { type LoginDeps } from "./login/session.js";
9
10
  import { type RunResult } from "./result.js";
@@ -14,6 +15,7 @@ export interface RunContext {
14
15
  readonly prompt: PromptIo;
15
16
  readonly processEnv: Record<string, string | undefined>;
16
17
  readonly verify: VerifyDeps;
18
+ readonly precheck: PrecheckDeps;
17
19
  readonly login: LoginDeps;
18
20
  /** Progress output while `login` waits. Streams, so it cannot go in RunResult. */
19
21
  readonly notify: (message: string) => void;