@ai21/gateway 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -17
- package/dist/agents/claude-code/desktop.d.ts +81 -0
- package/dist/agents/claude-code/desktop.js +615 -0
- package/dist/agents/claude-code/desktop.js.map +1 -0
- package/dist/agents/claude-code/desktopWindows.d.ts +10 -0
- package/dist/agents/claude-code/desktopWindows.js +151 -0
- package/dist/agents/claude-code/desktopWindows.js.map +1 -0
- package/dist/agents/claude-code/index.d.ts +7 -0
- package/dist/agents/claude-code/index.js +114 -0
- package/dist/agents/claude-code/index.js.map +1 -0
- package/dist/agents/claude-code/verify.d.ts +8 -50
- package/dist/agents/claude-code/verify.js +22 -9
- package/dist/agents/claude-code/verify.js.map +1 -1
- package/dist/agents/codex/config.d.ts +20 -0
- package/dist/agents/codex/config.js +347 -0
- package/dist/agents/codex/config.js.map +1 -0
- package/dist/agents/codex/index.d.ts +2 -0
- package/dist/agents/codex/index.js +79 -0
- package/dist/agents/codex/index.js.map +1 -0
- package/dist/agents/codex/snippets.d.ts +23 -0
- package/dist/agents/codex/snippets.js +39 -0
- package/dist/agents/codex/snippets.js.map +1 -0
- package/dist/agents/codex/status.d.ts +8 -0
- package/dist/agents/codex/status.js +36 -0
- package/dist/agents/codex/status.js.map +1 -0
- package/dist/agents/codex/toml.d.ts +57 -0
- package/dist/agents/codex/toml.js +196 -0
- package/dist/agents/codex/toml.js.map +1 -0
- package/dist/agents/codex/verify.d.ts +2 -0
- package/dist/agents/codex/verify.js +43 -0
- package/dist/agents/codex/verify.js.map +1 -0
- package/dist/agents/registry.d.ts +10 -0
- package/dist/agents/registry.js +14 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +45 -0
- package/dist/agents/types.js.map +1 -1
- package/dist/args.d.ts +2 -3
- package/dist/args.js +7 -9
- package/dist/args.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +19 -12
- package/dist/cli.js.map +1 -1
- package/dist/fs/safeFile.d.ts +1 -0
- package/dist/fs/safeFile.js.map +1 -1
- package/dist/fs/snapshot.d.ts +1 -1
- package/dist/fs/snapshot.js +1 -1
- package/dist/login/browser.js +2 -4
- package/dist/login/browser.js.map +1 -1
- package/dist/precheck.d.ts +4 -1
- package/dist/precheck.js +12 -9
- package/dist/precheck.js.map +1 -1
- package/dist/process.d.ts +2 -0
- package/dist/process.js +6 -4
- package/dist/process.js.map +1 -1
- package/dist/report.d.ts +16 -19
- package/dist/report.js +36 -62
- package/dist/report.js.map +1 -1
- package/dist/result.d.ts +7 -5
- package/dist/result.js +7 -5
- package/dist/result.js.map +1 -1
- package/dist/router.d.ts +7 -2
- package/dist/router.js +171 -114
- package/dist/router.js.map +1 -1
- package/dist/status.js +11 -3
- package/dist/status.js.map +1 -1
- package/dist/telemetry/events.d.ts +3 -2
- package/dist/telemetry/events.js +0 -6
- package/dist/telemetry/events.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DesktopDeps, type DesktopPaths } from "./desktop.js";
|
|
2
|
+
/** Where the installers put Claude.exe: per-user Programs, Squirrel's app-* folders, older names. */
|
|
3
|
+
export declare function windowsAppCandidates(local: string, list?: (dir: string) => string[]): string[];
|
|
4
|
+
/** Folders Claude Desktop runs from; Claude Code's own claude.exe lives elsewhere and never matches. */
|
|
5
|
+
export declare const DESKTOP_PATH_PATTERN = "\\\\WindowsApps\\\\Claude_|\\\\AnthropicClaude\\\\|\\\\Programs\\\\Claude( Desktop)?\\\\|\\\\Claude Nest\\\\|\\\\Claude Desktop\\\\";
|
|
6
|
+
/** The Store package's app id as published; the family name's suffix is Anthropic's publisher hash. */
|
|
7
|
+
export declare const STORE_APP_ID = "Claude_pzs8sxrjxfjjc!Claude";
|
|
8
|
+
/** The Store app's AUMID: the installed package, then the Start menu, then the published id. */
|
|
9
|
+
export declare function storeAppId(ps: (script: string) => Promise<string>): Promise<string>;
|
|
10
|
+
export declare function windowsDesktopDeps(paths: DesktopPaths, home: string, env?: Record<string, string | undefined>): DesktopDeps;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/** Claude Desktop on Windows: the macOS profile, with a token file, a paste prompt and PowerShell for the app. */
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from "node:fs";
|
|
4
|
+
import { dirname, join, win32 } from "node:path";
|
|
5
|
+
import { atomicWrite } from "../../fs/safeFile.js";
|
|
6
|
+
import { promptToken, run } from "./desktop.js";
|
|
7
|
+
import { windowsFileAcl } from "../../login/fileAcl.js";
|
|
8
|
+
function powershell(env) {
|
|
9
|
+
return win32.join(env["SystemRoot"] || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
|
|
10
|
+
}
|
|
11
|
+
/** Single-quoted for PowerShell, where the only escape is a doubled quote. */
|
|
12
|
+
function psQuote(value) {
|
|
13
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
14
|
+
}
|
|
15
|
+
/** Where the installers put Claude.exe: per-user Programs, Squirrel's app-* folders, older names. */
|
|
16
|
+
export function windowsAppCandidates(local, list = safeList) {
|
|
17
|
+
const fixed = [
|
|
18
|
+
join(local, "Programs", "Claude", "Claude.exe"),
|
|
19
|
+
join(local, "Programs", "Claude Desktop", "Claude.exe"),
|
|
20
|
+
join(local, "Claude", "Claude.exe"),
|
|
21
|
+
join(local, "Claude Nest", "Claude.exe"),
|
|
22
|
+
join(local, "Claude Desktop", "Claude.exe"),
|
|
23
|
+
join(local, "AnthropicClaude", "Claude.exe"),
|
|
24
|
+
];
|
|
25
|
+
const versioned = [
|
|
26
|
+
join(local, "AnthropicClaude"),
|
|
27
|
+
join(local, "Programs", "Claude"),
|
|
28
|
+
join(local, "Programs", "Claude Desktop"),
|
|
29
|
+
].flatMap((dir) => list(dir)
|
|
30
|
+
.filter((name) => name.startsWith("app-"))
|
|
31
|
+
.sort()
|
|
32
|
+
.reverse()
|
|
33
|
+
.map((name) => join(dir, name, "Claude.exe")));
|
|
34
|
+
return [...fixed, ...versioned];
|
|
35
|
+
}
|
|
36
|
+
function safeList(dir) {
|
|
37
|
+
try {
|
|
38
|
+
return readdirSync(dir);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Folders Claude Desktop runs from; Claude Code's own claude.exe lives elsewhere and never matches. */
|
|
45
|
+
export const DESKTOP_PATH_PATTERN = "\\\\WindowsApps\\\\Claude_|\\\\AnthropicClaude\\\\|\\\\Programs\\\\Claude( Desktop)?\\\\|\\\\Claude Nest\\\\|\\\\Claude Desktop\\\\";
|
|
46
|
+
/** The Store package's app id as published; the family name's suffix is Anthropic's publisher hash. */
|
|
47
|
+
export const STORE_APP_ID = "Claude_pzs8sxrjxfjjc!Claude";
|
|
48
|
+
/** The Store app's AUMID: the installed package, then the Start menu, then the published id. */
|
|
49
|
+
export async function storeAppId(ps) {
|
|
50
|
+
const lookups = [
|
|
51
|
+
"(Get-AppxPackage -Name 'Claude' | Select-Object -First 1).PackageFamilyName",
|
|
52
|
+
"(Get-StartApps | Where-Object { $_.Name -eq 'Claude' } | Select-Object -First 1).AppID",
|
|
53
|
+
];
|
|
54
|
+
for (const [n, script] of lookups.entries()) {
|
|
55
|
+
try {
|
|
56
|
+
const found = (await ps(script)).trim();
|
|
57
|
+
if (found !== "")
|
|
58
|
+
return n === 0 ? `${found}!Claude` : found;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Next lookup.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return STORE_APP_ID;
|
|
65
|
+
}
|
|
66
|
+
export function windowsDesktopDeps(paths, home, env = process.env) {
|
|
67
|
+
const local = env["LOCALAPPDATA"] || join(home, "AppData", "Local");
|
|
68
|
+
const appPath = () => windowsAppCandidates(local).find((candidate) => existsSync(candidate));
|
|
69
|
+
const ps = (script) => run(powershell(env), ["-NoProfile", "-NonInteractive", "-Command", script]);
|
|
70
|
+
// By install folder, window or not: a tray instance has no window but keeps the old settings.
|
|
71
|
+
const desktopProcs = `Get-Process claude -ErrorAction SilentlyContinue | Where-Object { $_.Path -match '${DESKTOP_PATH_PATTERN}' }`;
|
|
72
|
+
const mainWindows = `${desktopProcs} | Where-Object { $_.MainWindowHandle -ne 0 }`;
|
|
73
|
+
// Where the running app lives, kept from before the quit: the surest way back to it.
|
|
74
|
+
let runningPath;
|
|
75
|
+
const explorer = win32.join(env["SystemRoot"] || "C:\\Windows", "explorer.exe");
|
|
76
|
+
return {
|
|
77
|
+
platform: "win32",
|
|
78
|
+
// A Store install hides Claude.exe, but it still has its profile folder.
|
|
79
|
+
installed: () => appPath() !== undefined || existsSync(dirname(paths.normalConfig)),
|
|
80
|
+
isRunning: async () => {
|
|
81
|
+
try {
|
|
82
|
+
return (await ps(`(${desktopProcs} | Select-Object -First 1).Id`)).trim() !== "";
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
quit: async () => {
|
|
89
|
+
try {
|
|
90
|
+
runningPath = (await ps(`(${desktopProcs} | Select-Object -First 1).Path`)).trim() || undefined;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
runningPath = undefined;
|
|
94
|
+
}
|
|
95
|
+
await ps(`${mainWindows} | ForEach-Object { [void]$_.CloseMainWindow() }`);
|
|
96
|
+
},
|
|
97
|
+
// Closing the window only sends Desktop to the tray, so it never exits on its own.
|
|
98
|
+
forceQuit: async () => {
|
|
99
|
+
await ps(`${desktopProcs} | Stop-Process -Force`);
|
|
100
|
+
},
|
|
101
|
+
// A Store exe under WindowsApps cannot be started directly, so shell:AppsFolder is the fallback.
|
|
102
|
+
open: async () => {
|
|
103
|
+
const direct = [runningPath, appPath()].find((path) => path !== undefined && !/\\WindowsApps\\/i.test(path));
|
|
104
|
+
if (direct !== undefined) {
|
|
105
|
+
await ps(`Start-Process -FilePath ${psQuote(direct)}`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// explorer.exe exits 1 even when it launched the app, so its result means nothing.
|
|
109
|
+
await run(explorer, [`shell:AppsFolder\\${await storeAppId(ps)}`]).catch(() => undefined);
|
|
110
|
+
},
|
|
111
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
112
|
+
readToken: async () => {
|
|
113
|
+
try {
|
|
114
|
+
const token = readFileSync(paths.helper, "utf8").trim();
|
|
115
|
+
return token === "" ? undefined : token;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
// No newline: `type` prints the file verbatim, and Desktop wants the bare token.
|
|
122
|
+
storeToken: async (token) => {
|
|
123
|
+
mkdirSync(dirname(paths.helper), { recursive: true });
|
|
124
|
+
atomicWrite(paths.helper, token);
|
|
125
|
+
const refused = windowsFileAcl().restrictToOwner(paths.helper);
|
|
126
|
+
if (refused !== undefined) {
|
|
127
|
+
rmSync(paths.helper, { force: true });
|
|
128
|
+
throw new Error(`could not restrict the token file: ${refused}`);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
forgetToken: async () => {
|
|
132
|
+
rmSync(paths.helper, { force: true });
|
|
133
|
+
},
|
|
134
|
+
// The console shows the token; the paste prompt that follows takes it.
|
|
135
|
+
setupToken: async () => {
|
|
136
|
+
const hasClaude = await run(win32.join(env["SystemRoot"] || "C:\\Windows", "System32", "where.exe"), [
|
|
137
|
+
"claude",
|
|
138
|
+
]).then(() => true, () => false);
|
|
139
|
+
// A shell, because claude and npx may be .cmd shims; every word here is a literal.
|
|
140
|
+
const command = hasClaude ? "claude setup-token" : "npx -y @anthropic-ai/claude-code setup-token";
|
|
141
|
+
await new Promise((resolve) => {
|
|
142
|
+
const child = spawn(command, { shell: true, stdio: "inherit" });
|
|
143
|
+
child.on("exit", () => resolve());
|
|
144
|
+
child.on("error", () => resolve());
|
|
145
|
+
});
|
|
146
|
+
return undefined;
|
|
147
|
+
},
|
|
148
|
+
pasteToken: () => promptToken(),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=desktopWindows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktopWindows.js","sourceRoot":"","sources":["../../../src/agents/claude-code/desktopWindows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CodingAgent, Warning } from "../types.js";
|
|
2
|
+
/** Pure, so tests pass the shadowing file as data rather than write one. */
|
|
3
|
+
export declare function claudeWarnings(processEnv: Record<string, string | undefined>, localOverride: {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly agentId?: string;
|
|
6
|
+
} | undefined): Warning[];
|
|
7
|
+
export declare const claudeCode: CodingAgent;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** Claude Code: `env` keys in `settings.json`, checked with `claude auth status`, verified with `claude -p`. */
|
|
2
|
+
import { findOnPath } from "../../process.js";
|
|
3
|
+
import { claudeDesktopSurface } from "./desktop.js";
|
|
4
|
+
import { revertConfig } from "./revert.js";
|
|
5
|
+
import { resolvePaths, shadowingLocalConfig, writeConfig } from "./settings.js";
|
|
6
|
+
import { ccSettings, ccSettingsEnv } from "./snippets.js";
|
|
7
|
+
import { checkClaudeLogin } from "./status.js";
|
|
8
|
+
import { CLAUDE_COMMAND, resolveAnthropicKey, verify } from "./verify.js";
|
|
9
|
+
const text = {
|
|
10
|
+
// Predates the agent-neutral outcome; `--json` consumers already match on it.
|
|
11
|
+
noSubscriptionOutcome: "no-claude-credential",
|
|
12
|
+
noSubscription: {
|
|
13
|
+
"logged-out": {
|
|
14
|
+
headline: "No Claude subscription detected.",
|
|
15
|
+
nextStep: "If you have one, run `/login` inside `claude`, then re-run this command. Otherwise, subscribe to Claude.",
|
|
16
|
+
jsonReason: "no_claude_subscription",
|
|
17
|
+
telemetryReason: "agent not logged in",
|
|
18
|
+
},
|
|
19
|
+
"key-rejected": {
|
|
20
|
+
headline: "Anthropic rejected your API key.",
|
|
21
|
+
nextStep: "Check ANTHROPIC_API_KEY (or --anthropic-key), or unset it and run `/login` inside `claude`, then re-run this command.",
|
|
22
|
+
jsonReason: "anthropic_key_rejected",
|
|
23
|
+
telemetryReason: "upstream credential rejected",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
verifiedVia: {
|
|
27
|
+
"claude-cli": "`claude -p`",
|
|
28
|
+
"direct-ping": "a direct request",
|
|
29
|
+
},
|
|
30
|
+
skippedBecause: "no Anthropic credential was available",
|
|
31
|
+
notInstalled: {
|
|
32
|
+
message: "Neither the Claude Code CLI nor Claude Desktop was found. Install one of them to use the gateway, then re-run this command.",
|
|
33
|
+
jsonOutcome: "no-claude-cli",
|
|
34
|
+
// Kept apart from `no_claude_subscription` so a funnel can split them.
|
|
35
|
+
jsonReason: "claude_code_cli_not_installed",
|
|
36
|
+
telemetryReason: "agent cli not installed",
|
|
37
|
+
},
|
|
38
|
+
checkingLogin: "Checking your Claude login…",
|
|
39
|
+
loginFound: "Claude login found",
|
|
40
|
+
};
|
|
41
|
+
/** Pure, so tests pass the shadowing file as data rather than write one. */
|
|
42
|
+
export function claudeWarnings(processEnv, localOverride) {
|
|
43
|
+
const found = [];
|
|
44
|
+
if (processEnv.ANTHROPIC_API_KEY !== undefined && processEnv.ANTHROPIC_API_KEY !== "") {
|
|
45
|
+
found.push({
|
|
46
|
+
code: "anthropic-api-key-set",
|
|
47
|
+
// It shadows the claude.ai login and surfaces as a 401 from the gateway,
|
|
48
|
+
// which reads as "the CLI wrote a bad config" rather than "unset this".
|
|
49
|
+
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.",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (localOverride !== undefined) {
|
|
53
|
+
const { path, agentId } = localOverride;
|
|
54
|
+
found.push({
|
|
55
|
+
code: "shadowed-by-local-config",
|
|
56
|
+
message: `${path} also sets Claude Code's env, and it is read after this file — so it wins. ` +
|
|
57
|
+
(agentId === undefined
|
|
58
|
+
? "Requests will not use the agent configured here."
|
|
59
|
+
: `Requests will report as '${agentId}', not the agent configured here.`) +
|
|
60
|
+
" Remove its env block, or move your override into this file.",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return found;
|
|
64
|
+
}
|
|
65
|
+
export const claudeCode = {
|
|
66
|
+
surfaces: [claudeDesktopSurface()],
|
|
67
|
+
id: "claude-code",
|
|
68
|
+
kind: "claude_code",
|
|
69
|
+
displayName: "Claude Code",
|
|
70
|
+
configLabel: "settings.json",
|
|
71
|
+
targets: ["user", "repo"],
|
|
72
|
+
verifyFlags: ["anthropic-key"],
|
|
73
|
+
checkInstalled(ctx, deps) {
|
|
74
|
+
// An Anthropic key alone is enough: it serves any other client, and the direct ping verifies with it.
|
|
75
|
+
if (findOnPath(CLAUDE_COMMAND, deps.lookup) !== undefined)
|
|
76
|
+
return { kind: "present" };
|
|
77
|
+
return resolveAnthropicKey({ anthropicKey: ctx.upstreamKey, processEnv: ctx.processEnv }) === undefined
|
|
78
|
+
? { kind: "missing" }
|
|
79
|
+
: { kind: "present" };
|
|
80
|
+
},
|
|
81
|
+
resolvePaths(target, env) {
|
|
82
|
+
// `claude` must run where the file we wrote is the one that wins: a project-local
|
|
83
|
+
// settings.json outranks the home one, so a `--user` config is verified from home.
|
|
84
|
+
return { ...resolvePaths(target, env), verifyCwd: target === "user" ? env.home : env.cwd };
|
|
85
|
+
},
|
|
86
|
+
preview(inputs) {
|
|
87
|
+
return { text: ccSettings(inputs), json: { settings: { env: ccSettingsEnv(inputs) } } };
|
|
88
|
+
},
|
|
89
|
+
write(paths, inputs, options) {
|
|
90
|
+
return writeConfig(paths, ccSettingsEnv(inputs), options);
|
|
91
|
+
},
|
|
92
|
+
revert: revertConfig,
|
|
93
|
+
redact(value) {
|
|
94
|
+
return value.replace(/(x-ai21-key:\s*)\S+/gi, "$1****");
|
|
95
|
+
},
|
|
96
|
+
warnings(paths, processEnv) {
|
|
97
|
+
return claudeWarnings(processEnv, shadowingLocalConfig(paths));
|
|
98
|
+
},
|
|
99
|
+
async checkSubscription(paths, deps) {
|
|
100
|
+
switch (await checkClaudeLogin(paths.verifyCwd, deps)) {
|
|
101
|
+
case "logged-in":
|
|
102
|
+
return { kind: "present" };
|
|
103
|
+
case "logged-out":
|
|
104
|
+
return { kind: "missing", reason: "logged-out" };
|
|
105
|
+
case "inconclusive":
|
|
106
|
+
return { kind: "inconclusive" };
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
verify(ctx, deps) {
|
|
110
|
+
return verify({ ...ctx, anthropicKey: ctx.upstreamKey }, deps);
|
|
111
|
+
},
|
|
112
|
+
text,
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/claude-code/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* One real request through the gateway, to prove the written config works and flip
|
|
3
|
-
* the agent's `used` latch. Three tiers, because the CLI holds no Anthropic
|
|
4
|
-
* credential and the gateway requires one: `claude -p` if it is on PATH, else a
|
|
5
|
-
* direct ping if a key is available, else skip.
|
|
6
|
-
*
|
|
7
|
-
* Two invariants: exactly one request is fired — a winning tier means no later tier
|
|
8
|
-
* runs — and only a definite missing-credential result changes the exit code. A
|
|
9
|
-
* timeout or unrecognised failure stays a warning, so a flaky network never undoes a
|
|
10
|
-
* good write.
|
|
11
|
-
*/
|
|
12
|
-
import { type ResolvedUrls } from "../../args.js";
|
|
13
|
-
import type { AgentDeps } from "../types.js";
|
|
1
|
+
import type { AgentDeps, VerifyContext as AgentVerifyContext, VerifyOutcome } from "../types.js";
|
|
14
2
|
export declare const CLAUDE_COMMAND = "claude";
|
|
15
3
|
export declare const CLAUDE_PROMPT = "ai21-gateway CLI connectivity check \u2014 reply with OK and nothing else.";
|
|
16
4
|
export declare const PING_PATH = "/v1/messages";
|
|
@@ -31,49 +19,19 @@ export declare const PING_BODY: {
|
|
|
31
19
|
readonly content: "Hello through the gateway";
|
|
32
20
|
}];
|
|
33
21
|
};
|
|
34
|
-
export type VerifyVia = "claude-cli" | "direct-ping";
|
|
35
22
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
23
|
+
* `via` is `claude-cli` or `direct-ping`. A `no-subscription` reason is `logged-out`
|
|
24
|
+
* (`claude` has no login at all) or `key-rejected` (Anthropic itself refused the key
|
|
25
|
+
* the direct ping sent).
|
|
38
26
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
export type VerifyOutcome = {
|
|
42
|
-
readonly kind: "disabled";
|
|
43
|
-
} | {
|
|
44
|
-
readonly kind: "skipped";
|
|
45
|
-
readonly hint: string;
|
|
46
|
-
} | {
|
|
47
|
-
readonly kind: "passed";
|
|
48
|
-
readonly via: VerifyVia;
|
|
49
|
-
} | {
|
|
50
|
-
readonly kind: "failed";
|
|
51
|
-
readonly via: VerifyVia;
|
|
52
|
-
readonly reason: string;
|
|
53
|
-
} | {
|
|
54
|
-
readonly kind: "no-claude-credential";
|
|
55
|
-
readonly via: VerifyVia;
|
|
56
|
-
readonly reason: MissingCredential;
|
|
57
|
-
};
|
|
58
|
-
export interface VerifyContext {
|
|
59
|
-
readonly urls: ResolvedUrls;
|
|
60
|
-
readonly agentId: string;
|
|
61
|
-
readonly ai21Key: string;
|
|
62
|
-
readonly userId?: string | undefined;
|
|
27
|
+
/** Claude Code's verification also takes `--anthropic-key`, for the direct-ping tier. */
|
|
28
|
+
export interface VerifyContext extends AgentVerifyContext {
|
|
63
29
|
/** `--anthropic-key`, which outranks the environment. */
|
|
64
30
|
readonly anthropicKey?: string | undefined;
|
|
65
|
-
readonly processEnv: Record<string, string | undefined>;
|
|
66
|
-
/**
|
|
67
|
-
* Where to run `claude`: the directory in which the file we wrote is the one that
|
|
68
|
-
* wins. Home for `--user`, since a project-local settings.json outranks it.
|
|
69
|
-
*/
|
|
70
|
-
readonly cwd: string;
|
|
71
31
|
}
|
|
72
32
|
/** What the direct ping would send: `--anthropic-key`, else a non-empty ANTHROPIC_API_KEY. */
|
|
73
33
|
export declare function resolveAnthropicKey(ctx: Pick<VerifyContext, "anthropicKey" | "processEnv">): string | undefined;
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
* `x-api-key` cannot succeed, so whichever layer answers is the answer.
|
|
77
|
-
*/
|
|
34
|
+
/** The direct ping with a subscription OAuth token, which Claude Desktop sends as a bearer. */
|
|
35
|
+
export declare function verifyBearer(token: string, ctx: VerifyContext, deps: AgentDeps): Promise<VerifyOutcome>;
|
|
78
36
|
export type CredentialVerdict = "ai21-rejected" | "ai21-accepted" | "inconclusive";
|
|
79
37
|
export declare function verify(ctx: VerifyContext, deps: AgentDeps): Promise<VerifyOutcome>;
|
|
@@ -82,7 +82,7 @@ async function viaClaude(executable, ctx, deps) {
|
|
|
82
82
|
return { kind: "passed", via: "claude-cli" };
|
|
83
83
|
// Printed before any request is made, so it cannot be a gateway or network symptom.
|
|
84
84
|
if (!result.timedOut && result.code !== null && NOT_LOGGED_IN.test(result.output)) {
|
|
85
|
-
return { kind: "no-
|
|
85
|
+
return { kind: "no-subscription", via: "claude-cli", reason: "logged-out" };
|
|
86
86
|
}
|
|
87
87
|
const failed = (reason) => ({ kind: "failed", via: "claude-cli", reason });
|
|
88
88
|
if (result.timedOut) {
|
|
@@ -128,6 +128,19 @@ const STATUS_HINTS = {
|
|
|
128
128
|
403: "the key is not allowed to use this agent",
|
|
129
129
|
404: "check the gateway URL",
|
|
130
130
|
};
|
|
131
|
+
/**
|
|
132
|
+
* Which side rejected us, without needing an Anthropic key: a deliberately invalid
|
|
133
|
+
* `x-api-key` cannot succeed, so whichever layer answers is the answer.
|
|
134
|
+
*/
|
|
135
|
+
/** Shaped like Claude Code's request: a subscription token gets 429 on Sonnet without its system prompt and the oauth beta. */
|
|
136
|
+
const OAUTH_PING_BODY = {
|
|
137
|
+
...PING_BODY,
|
|
138
|
+
system: [{ type: "text", text: "You are Claude Code, Anthropic's official CLI for Claude." }],
|
|
139
|
+
};
|
|
140
|
+
/** The direct ping with a subscription OAuth token, which Claude Desktop sends as a bearer. */
|
|
141
|
+
export function verifyBearer(token, ctx, deps) {
|
|
142
|
+
return viaDirectPing({ authorization: `Bearer ${token}`, "anthropic-beta": "oauth-2025-04-20" }, ctx, deps, OAUTH_PING_BODY);
|
|
143
|
+
}
|
|
131
144
|
/** A value that cannot be a real credential, so the probe can never succeed. */
|
|
132
145
|
const PROBE_ANTHROPIC_KEY = "sk-ant-invalid-credential-probe";
|
|
133
146
|
function classifyRejection(body) {
|
|
@@ -174,7 +187,7 @@ async function probeCredentials(ctx, deps) {
|
|
|
174
187
|
try {
|
|
175
188
|
const response = await deps.fetchImpl(`${ctx.urls.gateway}${PING_PATH}`, {
|
|
176
189
|
method: "POST",
|
|
177
|
-
headers: pingHeaders(PROBE_ANTHROPIC_KEY, ctx),
|
|
190
|
+
headers: pingHeaders({ "x-api-key": PROBE_ANTHROPIC_KEY }, ctx),
|
|
178
191
|
body: JSON.stringify(PING_BODY),
|
|
179
192
|
signal: AbortSignal.timeout(PING_TIMEOUT_MS),
|
|
180
193
|
});
|
|
@@ -187,11 +200,11 @@ async function probeCredentials(ctx, deps) {
|
|
|
187
200
|
return "inconclusive";
|
|
188
201
|
}
|
|
189
202
|
}
|
|
190
|
-
function pingHeaders(
|
|
203
|
+
function pingHeaders(auth, ctx) {
|
|
191
204
|
const headers = {
|
|
192
205
|
"x-ai21-key": ctx.ai21Key,
|
|
193
206
|
"x-agent-id": ctx.agentId,
|
|
194
|
-
|
|
207
|
+
...auth,
|
|
195
208
|
"anthropic-version": "2023-06-01",
|
|
196
209
|
"content-type": "application/json",
|
|
197
210
|
};
|
|
@@ -202,7 +215,7 @@ function pingHeaders(anthropicKey, ctx) {
|
|
|
202
215
|
function isAbort(err) {
|
|
203
216
|
return err instanceof Error && (err.name === "AbortError" || err.name === "TimeoutError");
|
|
204
217
|
}
|
|
205
|
-
async function viaDirectPing(
|
|
218
|
+
async function viaDirectPing(auth, ctx, deps, body = PING_BODY) {
|
|
206
219
|
const failed = (reason) => ({ kind: "failed", via: "direct-ping", reason });
|
|
207
220
|
// This carries both credentials, so an off-box plain-http endpoint would put them
|
|
208
221
|
// on the wire in the clear. Refused rather than sent; the write still stands.
|
|
@@ -212,14 +225,14 @@ async function viaDirectPing(anthropicKey, ctx, deps) {
|
|
|
212
225
|
try {
|
|
213
226
|
const response = await deps.fetchImpl(`${ctx.urls.gateway}${PING_PATH}`, {
|
|
214
227
|
method: "POST",
|
|
215
|
-
headers: pingHeaders(
|
|
216
|
-
body: JSON.stringify(
|
|
228
|
+
headers: pingHeaders(auth, ctx),
|
|
229
|
+
body: JSON.stringify(body),
|
|
217
230
|
signal: AbortSignal.timeout(PING_TIMEOUT_MS),
|
|
218
231
|
});
|
|
219
232
|
if (response.ok)
|
|
220
233
|
return { kind: "passed", via: "direct-ping" };
|
|
221
234
|
if (response.status === 401 && isAnthropicAuthError((await response.text?.()) ?? "")) {
|
|
222
|
-
return { kind: "no-
|
|
235
|
+
return { kind: "no-subscription", via: "direct-ping", reason: "key-rejected" };
|
|
223
236
|
}
|
|
224
237
|
const hint = STATUS_HINTS[response.status];
|
|
225
238
|
const note = response.status === 401 ? environmentNote(ctx) : "";
|
|
@@ -240,7 +253,7 @@ export async function verify(ctx, deps) {
|
|
|
240
253
|
return viaClaude(executable, ctx, deps);
|
|
241
254
|
const anthropicKey = resolveAnthropicKey(ctx);
|
|
242
255
|
if (anthropicKey !== undefined)
|
|
243
|
-
return viaDirectPing(anthropicKey, ctx, deps);
|
|
256
|
+
return viaDirectPing({ "x-api-key": anthropicKey }, ctx, deps);
|
|
244
257
|
return { kind: "skipped", hint: `${manualHint(ctx.cwd)}.` };
|
|
245
258
|
}
|
|
246
259
|
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/agents/claude-code/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/agents/claude-code/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ConfigPaths } from "../../fs/safeFile.js";
|
|
2
|
+
import type { ConfigOutcome, RevertOptions, RevertOutcome, SnippetInputs } from "../types.js";
|
|
3
|
+
import { type Scan } from "./toml.js";
|
|
4
|
+
/** What a conflict shows instead of an AI21 key. */
|
|
5
|
+
export declare const REDACTED = "****";
|
|
6
|
+
export declare const MARKER_BEGIN = "# >>> AI21 Gateway (managed by ai21-gateway; `ai21-gateway uninstall --client codex` removes it)";
|
|
7
|
+
export declare const MARKER_END = "# <<< AI21 Gateway";
|
|
8
|
+
/** `CODEX_HOME` wins, as it does for Codex; a relative one is resolved against the cwd, as Codex does. */
|
|
9
|
+
export declare function codexHome(env: {
|
|
10
|
+
readonly home: string;
|
|
11
|
+
readonly cwd: string;
|
|
12
|
+
readonly processEnv: Record<string, string | undefined>;
|
|
13
|
+
}): string;
|
|
14
|
+
export declare function resolveCodexPaths(dir: string): ConfigPaths;
|
|
15
|
+
/** The agent id our block names, for the uninstall guard. */
|
|
16
|
+
export declare function storedAgentId(scanned: Scan): string | undefined;
|
|
17
|
+
export declare function writeCodexConfig(paths: ConfigPaths, inputs: SnippetInputs, options: {
|
|
18
|
+
readonly force: boolean;
|
|
19
|
+
}): ConfigOutcome;
|
|
20
|
+
export declare function revertCodexConfig(paths: ConfigPaths, options: RevertOptions): RevertOutcome;
|