@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,615 @@
|
|
|
1
|
+
/** Claude Desktop, a surface of the Claude Code agent: routed through the gateway by its own third-party inference mode, on the user's own subscription. */
|
|
2
|
+
import { execFile, spawn } from "node:child_process";
|
|
3
|
+
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { dirname, join, win32 } from "node:path";
|
|
6
|
+
import { EXIT } from "../../result.js";
|
|
7
|
+
import { nothingWasWritten } from "../../report.js";
|
|
8
|
+
import { atomicWrite, describeFsError } from "../../fs/safeFile.js";
|
|
9
|
+
import { windowsDesktopDeps } from "./desktopWindows.js";
|
|
10
|
+
import { isPlainObject, serialize } from "./settings.js";
|
|
11
|
+
import { verifyBearer } from "./verify.js";
|
|
12
|
+
/** Fixed, so a re-install replaces our profile instead of stacking a second one. */
|
|
13
|
+
export const DESKTOP_PROFILE_ID = "00000000-0000-4000-8000-00000000a121";
|
|
14
|
+
export const DESKTOP_PROFILE_NAME = "AI21 Gateway";
|
|
15
|
+
export const DESKTOP_BUNDLE_ID = "com.anthropic.claudefordesktop";
|
|
16
|
+
/** Where the subscription token lives. Read raw by the helper, so it is not base64 like the login secrets. */
|
|
17
|
+
export const TOKEN_SERVICE = "ai21-gateway-claude-desktop";
|
|
18
|
+
export const TOKEN_ACCOUNT = "claude-oauth-token";
|
|
19
|
+
const SECURITY_BIN = "/usr/bin/security";
|
|
20
|
+
/** What `claude setup-token` prints, wrapped onto following lines that hold nothing but token characters. */
|
|
21
|
+
const OAUTH_TOKEN = /sk-ant-oat01-[A-Za-z0-9_-]+(?:\n[ \t]*[A-Za-z0-9_-]+(?=[ \t]*(?:\n|$)))*/;
|
|
22
|
+
const MIN_TOKEN_LENGTH = 90;
|
|
23
|
+
/** A subscription token, or undefined: it is quoted into `security -i` and sent as a header, so nothing else may pass. */
|
|
24
|
+
export function oauthToken(value) {
|
|
25
|
+
const token = /sk-ant-oat01-[A-Za-z0-9_-]+/.exec(value ?? "")?.[0];
|
|
26
|
+
return token !== undefined && token.length >= MIN_TOKEN_LENGTH ? token : undefined;
|
|
27
|
+
}
|
|
28
|
+
/** The first root that exists, else the first: installs differ in naming, not in layout. */
|
|
29
|
+
function firstExisting(candidates) {
|
|
30
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
|
|
31
|
+
}
|
|
32
|
+
export function desktopPaths(home, platform = process.platform, env = process.env) {
|
|
33
|
+
const ours = join(home, ".config", "ai21-gateway");
|
|
34
|
+
if (platform === "win32") {
|
|
35
|
+
const local = env["LOCALAPPDATA"] || join(home, "AppData", "Local");
|
|
36
|
+
const normal = firstExisting([join(local, "Claude"), join(local, "Claude Nest")]);
|
|
37
|
+
const thirdParty = firstExisting([join(local, "Claude-3p"), join(local, "Claude Nest-3p")]);
|
|
38
|
+
const tokenFile = join(ours, "claude-desktop-token");
|
|
39
|
+
// A real .exe: Electron cannot spawn a .cmd without a shell since the CVE-2024-27980 fix.
|
|
40
|
+
const cmd = win32.join(env["SystemRoot"] || "C:\\Windows", "System32", "cmd.exe");
|
|
41
|
+
return {
|
|
42
|
+
platform: "win32",
|
|
43
|
+
normalConfig: join(normal, "claude_desktop_config.json"),
|
|
44
|
+
thirdPartyConfig: join(thirdParty, "claude_desktop_config.json"),
|
|
45
|
+
meta: join(thirdParty, "configLibrary", "_meta.json"),
|
|
46
|
+
profile: join(thirdParty, "configLibrary", `${DESKTOP_PROFILE_ID}.json`),
|
|
47
|
+
restore: join(ours, "claude-desktop-restore.json"),
|
|
48
|
+
helper: tokenFile,
|
|
49
|
+
helperCommand: { path: cmd, args: ["/d", "/c", "type", tokenFile] },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const support = join(home, "Library", "Application Support");
|
|
53
|
+
const thirdParty = join(support, "Claude-3p");
|
|
54
|
+
const script = join(ours, "claude-desktop-credential");
|
|
55
|
+
return {
|
|
56
|
+
platform: "darwin",
|
|
57
|
+
normalConfig: join(support, "Claude", "claude_desktop_config.json"),
|
|
58
|
+
thirdPartyConfig: join(thirdParty, "claude_desktop_config.json"),
|
|
59
|
+
meta: join(thirdParty, "configLibrary", "_meta.json"),
|
|
60
|
+
profile: join(thirdParty, "configLibrary", `${DESKTOP_PROFILE_ID}.json`),
|
|
61
|
+
restore: join(ours, "claude-desktop-restore.json"),
|
|
62
|
+
helper: script,
|
|
63
|
+
helperCommand: { path: script },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function desktopHeaders({ agentId, ai21Key, userId, client }) {
|
|
67
|
+
return {
|
|
68
|
+
"x-ai21-key": ai21Key,
|
|
69
|
+
"x-agent-id": agentId,
|
|
70
|
+
...(userId === undefined ? {} : { "x-ai21-user-id": userId }),
|
|
71
|
+
...(client === undefined ? {} : { "x-ai21-client": client }),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function helperScript() {
|
|
75
|
+
return `#!/bin/sh\nexec ${SECURITY_BIN} find-generic-password -s ${TOKEN_SERVICE} -a ${TOKEN_ACCOUNT} -w\n`;
|
|
76
|
+
}
|
|
77
|
+
export function desktopProfile(inputs, paths) {
|
|
78
|
+
const { path, args } = paths.helperCommand;
|
|
79
|
+
return {
|
|
80
|
+
inferenceProvider: "gateway",
|
|
81
|
+
inferenceGatewayBaseUrl: inputs.gatewayUrl,
|
|
82
|
+
inferenceCredentialKind: "helper-script",
|
|
83
|
+
inferenceCredentialHelper: path,
|
|
84
|
+
...(args === undefined ? {} : { inferenceCredentialHelperArgs: args }),
|
|
85
|
+
inferenceGatewayAuthScheme: "bearer",
|
|
86
|
+
inferenceCustomHeaders: desktopHeaders(inputs),
|
|
87
|
+
deploymentDisplayName: DESKTOP_PROFILE_NAME,
|
|
88
|
+
isClaudeCodeForDesktopEnabled: true,
|
|
89
|
+
// Everything else off: no switching back to 1P from the UI, no telemetry to Anthropic.
|
|
90
|
+
disableDeploymentModeChooser: true,
|
|
91
|
+
disableEssentialTelemetry: true,
|
|
92
|
+
disableNonessentialTelemetry: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
class Malformed extends Error {
|
|
96
|
+
path;
|
|
97
|
+
constructor(path) {
|
|
98
|
+
super("not a JSON object");
|
|
99
|
+
this.path = path;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function readJson(path) {
|
|
103
|
+
if (!existsSync(path))
|
|
104
|
+
return {};
|
|
105
|
+
let parsed;
|
|
106
|
+
try {
|
|
107
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new Malformed(path);
|
|
111
|
+
}
|
|
112
|
+
if (!isPlainObject(parsed))
|
|
113
|
+
throw new Malformed(path);
|
|
114
|
+
return parsed;
|
|
115
|
+
}
|
|
116
|
+
function writeJson(path, value) {
|
|
117
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
118
|
+
atomicWrite(path, serialize(value));
|
|
119
|
+
}
|
|
120
|
+
function entriesWithout(meta, id) {
|
|
121
|
+
const entries = Array.isArray(meta.entries) ? meta.entries : [];
|
|
122
|
+
return entries.filter((entry) => !(isPlainObject(entry) && entry.id === id));
|
|
123
|
+
}
|
|
124
|
+
function asString(value) {
|
|
125
|
+
return typeof value === "string" ? value : undefined;
|
|
126
|
+
}
|
|
127
|
+
/** Every file is parsed before any is written, so a malformed one leaves all untouched. */
|
|
128
|
+
export function writeDesktopConfig(paths, inputs) {
|
|
129
|
+
try {
|
|
130
|
+
const meta = readJson(paths.meta);
|
|
131
|
+
const normal = readJson(paths.normalConfig);
|
|
132
|
+
const thirdParty = readJson(paths.thirdPartyConfig);
|
|
133
|
+
// A re-install must not overwrite the state from before the first one with our own.
|
|
134
|
+
if (!existsSync(paths.restore)) {
|
|
135
|
+
const previous = {
|
|
136
|
+
appliedId: meta.appliedId === DESKTOP_PROFILE_ID ? undefined : asString(meta.appliedId),
|
|
137
|
+
normalMode: asString(normal.deploymentMode),
|
|
138
|
+
thirdPartyMode: asString(thirdParty.deploymentMode),
|
|
139
|
+
};
|
|
140
|
+
writeJson(paths.restore, previous);
|
|
141
|
+
}
|
|
142
|
+
// On Windows the helper is cmd.exe itself, and the token file is written with the token.
|
|
143
|
+
if (paths.platform === "darwin") {
|
|
144
|
+
mkdirSync(dirname(paths.helper), { recursive: true, mode: 0o700 });
|
|
145
|
+
atomicWrite(paths.helper, helperScript());
|
|
146
|
+
chmodSync(paths.helper, 0o700);
|
|
147
|
+
}
|
|
148
|
+
writeJson(paths.profile, desktopProfile(inputs, paths));
|
|
149
|
+
writeJson(paths.meta, {
|
|
150
|
+
...meta,
|
|
151
|
+
appliedId: DESKTOP_PROFILE_ID,
|
|
152
|
+
entries: [...entriesWithout(meta, DESKTOP_PROFILE_ID), { id: DESKTOP_PROFILE_ID, name: DESKTOP_PROFILE_NAME }],
|
|
153
|
+
});
|
|
154
|
+
writeJson(paths.thirdPartyConfig, { ...thirdParty, deploymentMode: "3p" });
|
|
155
|
+
writeJson(paths.normalConfig, { ...normal, deploymentMode: "3p" });
|
|
156
|
+
return { kind: "written", path: paths.profile };
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (err instanceof Malformed)
|
|
160
|
+
return { kind: "malformed", path: err.path, reason: err.message };
|
|
161
|
+
return { kind: "failed", path: paths.profile, reason: describeFsError(err) };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function withMode(config, mode) {
|
|
165
|
+
const rest = { ...config };
|
|
166
|
+
delete rest.deploymentMode;
|
|
167
|
+
return mode === undefined ? rest : { ...rest, deploymentMode: mode };
|
|
168
|
+
}
|
|
169
|
+
export function revertDesktopConfig(paths) {
|
|
170
|
+
try {
|
|
171
|
+
const meta = readJson(paths.meta);
|
|
172
|
+
const ours = existsSync(paths.profile) || meta.appliedId === DESKTOP_PROFILE_ID;
|
|
173
|
+
if (!ours)
|
|
174
|
+
return { kind: "not-configured", path: paths.profile };
|
|
175
|
+
const saved = readJson(paths.restore);
|
|
176
|
+
const normal = readJson(paths.normalConfig);
|
|
177
|
+
const thirdParty = readJson(paths.thirdPartyConfig);
|
|
178
|
+
const metaRest = { ...meta };
|
|
179
|
+
delete metaRest.appliedId;
|
|
180
|
+
const appliedId = meta.appliedId === DESKTOP_PROFILE_ID ? saved.appliedId : asString(meta.appliedId);
|
|
181
|
+
writeJson(paths.meta, {
|
|
182
|
+
...metaRest,
|
|
183
|
+
...(appliedId === undefined ? {} : { appliedId }),
|
|
184
|
+
entries: entriesWithout(meta, DESKTOP_PROFILE_ID),
|
|
185
|
+
});
|
|
186
|
+
// No saved state means we cannot know better than the app's own default: 1P.
|
|
187
|
+
const hadSaved = existsSync(paths.restore);
|
|
188
|
+
writeJson(paths.thirdPartyConfig, withMode(thirdParty, hadSaved ? saved.thirdPartyMode : "1p"));
|
|
189
|
+
writeJson(paths.normalConfig, withMode(normal, hadSaved ? saved.normalMode : "1p"));
|
|
190
|
+
rmSync(paths.profile, { force: true });
|
|
191
|
+
rmSync(paths.restore, { force: true });
|
|
192
|
+
rmSync(paths.helper, { force: true });
|
|
193
|
+
return { kind: "reverted", path: paths.profile };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
if (err instanceof Malformed)
|
|
197
|
+
return { kind: "malformed", path: err.path, reason: err.message };
|
|
198
|
+
return { kind: "failed", path: paths.profile, reason: describeFsError(err) };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function run(file, args) {
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
execFile(file, [...args], { timeout: 10_000 }, (err, stdout) => (err ? reject(err) : resolve(stdout)));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
export function macDesktopDeps() {
|
|
207
|
+
return {
|
|
208
|
+
platform: process.platform,
|
|
209
|
+
installed: () => existsSync("/Applications/Claude.app"),
|
|
210
|
+
isRunning: async () => {
|
|
211
|
+
try {
|
|
212
|
+
const out = await run("osascript", ["-e", `application id "${DESKTOP_BUNDLE_ID}" is running`]);
|
|
213
|
+
return out.trim() === "true";
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
quit: async () => {
|
|
220
|
+
await run("osascript", ["-e", `tell application id "${DESKTOP_BUNDLE_ID}" to quit`]);
|
|
221
|
+
},
|
|
222
|
+
open: async () => {
|
|
223
|
+
await run("/usr/bin/open", ["-b", DESKTOP_BUNDLE_ID]);
|
|
224
|
+
},
|
|
225
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
226
|
+
readToken: async () => {
|
|
227
|
+
try {
|
|
228
|
+
const out = (await run(SECURITY_BIN, ["find-generic-password", "-s", TOKEN_SERVICE, "-a", TOKEN_ACCOUNT, "-w"])).trim();
|
|
229
|
+
return out === "" ? undefined : out;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
// Through `security -i`, so the token never appears in argv where `ps` shows it.
|
|
236
|
+
storeToken: (token) => runWithInput(SECURITY_BIN, ["-i"], `add-generic-password -U -s ${TOKEN_SERVICE} -a ${TOKEN_ACCOUNT} -w '${token}'\n`),
|
|
237
|
+
forgetToken: async () => {
|
|
238
|
+
try {
|
|
239
|
+
await run(SECURITY_BIN, ["delete-generic-password", "-s", TOKEN_SERVICE, "-a", TOKEN_ACCOUNT]);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Nothing stored is the state we wanted.
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
setupToken: () => runSetupToken(),
|
|
246
|
+
pasteToken: () => promptToken(),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function runWithInput(file, args, input) {
|
|
250
|
+
return new Promise((resolve, reject) => {
|
|
251
|
+
const child = execFile(file, [...args], { timeout: 10_000 }, (err) => (err ? reject(err) : resolve()));
|
|
252
|
+
child.stdin?.end(input);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/** Replays a terminal transcript onto a grid: Claude Code draws with cursor moves, so the token is never in one piece. */
|
|
256
|
+
export function screenFromTranscript(transcript) {
|
|
257
|
+
const lines = [[]];
|
|
258
|
+
let row = 0;
|
|
259
|
+
let col = 0;
|
|
260
|
+
let saved = { row: 0, col: 0 };
|
|
261
|
+
const line = (r) => {
|
|
262
|
+
while (lines.length <= r)
|
|
263
|
+
lines.push([]);
|
|
264
|
+
return lines[r];
|
|
265
|
+
};
|
|
266
|
+
const chars = Array.from(transcript);
|
|
267
|
+
for (let i = 0; i < chars.length; i++) {
|
|
268
|
+
const c = chars[i];
|
|
269
|
+
if (c === "\x1b") {
|
|
270
|
+
const next = chars[i + 1];
|
|
271
|
+
if (next === "[") {
|
|
272
|
+
let j = i + 2;
|
|
273
|
+
let params = "";
|
|
274
|
+
while (j < chars.length && !/[@-~]/.test(chars[j]))
|
|
275
|
+
params += chars[j++];
|
|
276
|
+
const final = chars[j];
|
|
277
|
+
i = j;
|
|
278
|
+
const nums = params
|
|
279
|
+
.replace(/^[?<>=]/, "")
|
|
280
|
+
.split(";")
|
|
281
|
+
.map((n) => Number.parseInt(n, 10));
|
|
282
|
+
const n = Number.isNaN(nums[0]) ? 1 : nums[0];
|
|
283
|
+
if (params.startsWith("?") || params.startsWith(">") || params.startsWith("<") || params.startsWith("="))
|
|
284
|
+
continue;
|
|
285
|
+
if (final === "A")
|
|
286
|
+
row = Math.max(0, row - n);
|
|
287
|
+
else if (final === "B")
|
|
288
|
+
row += n;
|
|
289
|
+
else if (final === "C")
|
|
290
|
+
col += n;
|
|
291
|
+
else if (final === "D")
|
|
292
|
+
col = Math.max(0, col - n);
|
|
293
|
+
else if (final === "G")
|
|
294
|
+
col = Math.max(0, n - 1);
|
|
295
|
+
else if (final === "K") {
|
|
296
|
+
const mode = Number.isNaN(nums[0]) ? 0 : nums[0];
|
|
297
|
+
const current = line(row);
|
|
298
|
+
if (mode === 0)
|
|
299
|
+
current.length = Math.min(current.length, col);
|
|
300
|
+
else if (mode === 1)
|
|
301
|
+
for (let k = 0; k <= col && k < current.length; k++)
|
|
302
|
+
current[k] = " ";
|
|
303
|
+
else
|
|
304
|
+
current.length = 0;
|
|
305
|
+
}
|
|
306
|
+
else if (final === "J") {
|
|
307
|
+
const mode = Number.isNaN(nums[0]) ? 0 : nums[0];
|
|
308
|
+
if (mode === 0) {
|
|
309
|
+
line(row).length = Math.min(line(row).length, col);
|
|
310
|
+
lines.length = row + 1;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else if (next === "]") {
|
|
315
|
+
// OSC, ended by BEL or ESC backslash.
|
|
316
|
+
let j = i + 2;
|
|
317
|
+
while (j < chars.length && chars[j] !== "\x07" && !(chars[j] === "\x1b" && chars[j + 1] === "\\"))
|
|
318
|
+
j++;
|
|
319
|
+
i = chars[j] === "\x07" ? j : j + 1;
|
|
320
|
+
}
|
|
321
|
+
else if (next === "7") {
|
|
322
|
+
saved = { row, col };
|
|
323
|
+
i++;
|
|
324
|
+
}
|
|
325
|
+
else if (next === "8") {
|
|
326
|
+
({ row, col } = saved);
|
|
327
|
+
i++;
|
|
328
|
+
}
|
|
329
|
+
else if (next === "(" || next === ")") {
|
|
330
|
+
i += 2;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
i++;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else if (c === "\r") {
|
|
337
|
+
col = 0;
|
|
338
|
+
}
|
|
339
|
+
else if (c === "\n") {
|
|
340
|
+
row++;
|
|
341
|
+
line(row);
|
|
342
|
+
}
|
|
343
|
+
else if (c === "\b") {
|
|
344
|
+
col = Math.max(0, col - 1);
|
|
345
|
+
}
|
|
346
|
+
else if (c >= " ") {
|
|
347
|
+
const current = line(row);
|
|
348
|
+
while (current.length < col)
|
|
349
|
+
current.push(" ");
|
|
350
|
+
current[col++] = c;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return lines.map((l) => l.join("").trimEnd()).join("\n");
|
|
354
|
+
}
|
|
355
|
+
/** The token on the final screen, joined across the lines the terminal wrapped it onto. */
|
|
356
|
+
export function tokenFromTranscript(transcript) {
|
|
357
|
+
return oauthToken(OAUTH_TOKEN.exec(screenFromTranscript(transcript))?.[0].replace(/\s+/g, ""));
|
|
358
|
+
}
|
|
359
|
+
export async function promptToken() {
|
|
360
|
+
if (!process.stdin.isTTY)
|
|
361
|
+
return undefined;
|
|
362
|
+
process.stderr.write("Paste the token shown above (input is hidden), then press Enter: ");
|
|
363
|
+
process.stdin.setRawMode(true);
|
|
364
|
+
process.stdin.resume();
|
|
365
|
+
return new Promise((resolve) => {
|
|
366
|
+
let value = "";
|
|
367
|
+
const done = (result) => {
|
|
368
|
+
process.stdin.setRawMode(false);
|
|
369
|
+
process.stdin.pause();
|
|
370
|
+
process.stdin.off("data", onData);
|
|
371
|
+
process.stderr.write("\n");
|
|
372
|
+
resolve(result);
|
|
373
|
+
};
|
|
374
|
+
const onData = (chunk) => {
|
|
375
|
+
for (const ch of chunk.toString("utf8")) {
|
|
376
|
+
if (ch === "\r" || ch === "\n")
|
|
377
|
+
return done(oauthToken(value.replace(/\s+/g, "")));
|
|
378
|
+
if (ch === "\u0003")
|
|
379
|
+
return done(undefined);
|
|
380
|
+
if (ch === "\u007f")
|
|
381
|
+
value = value.slice(0, -1);
|
|
382
|
+
else if (ch >= " ")
|
|
383
|
+
value += ch;
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
process.stdin.on("data", onData);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
/** Runs `setup-token` under `script`, which gives it a real terminal and keeps a transcript to read the token from. */
|
|
390
|
+
async function runSetupToken() {
|
|
391
|
+
const dir = mkdtempSync(join(tmpdir(), "ai21-gateway-"));
|
|
392
|
+
const log = join(dir, "setup-token.log");
|
|
393
|
+
const command = (await onPath("claude"))
|
|
394
|
+
? ["claude", "setup-token"]
|
|
395
|
+
: ["npx", "-y", "@anthropic-ai/claude-code", "setup-token"];
|
|
396
|
+
try {
|
|
397
|
+
await new Promise((resolve) => {
|
|
398
|
+
const child = spawn("/usr/bin/script", ["-q", log, ...command], { stdio: "inherit" });
|
|
399
|
+
child.on("exit", () => resolve());
|
|
400
|
+
child.on("error", () => resolve());
|
|
401
|
+
});
|
|
402
|
+
return existsSync(log) ? tokenFromTranscript(readFileSync(log, "utf8")) : undefined;
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
rmSync(dir, { recursive: true, force: true });
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
async function onPath(name) {
|
|
409
|
+
try {
|
|
410
|
+
await run("/usr/bin/which", [name]);
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const QUIT_WAIT_MS = 30_000;
|
|
418
|
+
const POLL_MS = 500;
|
|
419
|
+
const FORCE_AFTER_MS = 10_000;
|
|
420
|
+
async function waitForExit(deps, limitMs) {
|
|
421
|
+
for (let waited = 0; await deps.isRunning(); waited += POLL_MS) {
|
|
422
|
+
if (waited >= limitMs)
|
|
423
|
+
return false;
|
|
424
|
+
await deps.sleep(POLL_MS);
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
/** Desktop reads the profile only at launch: quit it if running, then open it either way. */
|
|
429
|
+
export async function relaunchDesktop(deps) {
|
|
430
|
+
const wasRunning = await deps.isRunning();
|
|
431
|
+
if (wasRunning) {
|
|
432
|
+
try {
|
|
433
|
+
await deps.quit();
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
return "still-running";
|
|
437
|
+
}
|
|
438
|
+
// Where a force exists, the grace is short: the app is sitting in the tray, not saving.
|
|
439
|
+
if (!(await waitForExit(deps, deps.forceQuit === undefined ? QUIT_WAIT_MS : FORCE_AFTER_MS))) {
|
|
440
|
+
if (deps.forceQuit === undefined)
|
|
441
|
+
return "still-running";
|
|
442
|
+
try {
|
|
443
|
+
await deps.forceQuit();
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return "still-running";
|
|
447
|
+
}
|
|
448
|
+
if (!(await waitForExit(deps, FORCE_AFTER_MS)))
|
|
449
|
+
return "still-running";
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
try {
|
|
453
|
+
await deps.open();
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return "open-failed";
|
|
457
|
+
}
|
|
458
|
+
return wasRunning ? "restarted" : "opened";
|
|
459
|
+
}
|
|
460
|
+
/** Tests replace the app and keychain; everything else about the surface is real. */
|
|
461
|
+
export function claudeDesktopSurface(desktopDeps) {
|
|
462
|
+
const depsFor = (env) => desktopDeps?.(env) ??
|
|
463
|
+
(process.platform === "win32"
|
|
464
|
+
? windowsDesktopDeps(desktopPaths(env.home, "win32", env.processEnv), env.home, env.processEnv)
|
|
465
|
+
: macDesktopDeps());
|
|
466
|
+
const pathsFor = (env, deps) => desktopPaths(env.home, deps.platform, env.processEnv);
|
|
467
|
+
return {
|
|
468
|
+
id: "desktop",
|
|
469
|
+
displayName: "Claude Desktop",
|
|
470
|
+
detect: (env) => {
|
|
471
|
+
const deps = depsFor(env);
|
|
472
|
+
return (deps.platform === "darwin" || deps.platform === "win32") && deps.installed();
|
|
473
|
+
},
|
|
474
|
+
install: (ctx) => {
|
|
475
|
+
const deps = depsFor(ctx.env);
|
|
476
|
+
return installDesktop(ctx, deps, pathsFor(ctx.env, deps));
|
|
477
|
+
},
|
|
478
|
+
uninstall: async (env) => {
|
|
479
|
+
const deps = depsFor(env);
|
|
480
|
+
const outcome = revertDesktopConfig(pathsFor(env, deps));
|
|
481
|
+
if (outcome.kind === "reverted")
|
|
482
|
+
await deps.forgetToken();
|
|
483
|
+
if (outcome.kind === "not-configured") {
|
|
484
|
+
return { code: EXIT.OK, configured: false, text: "", json: { outcome: outcome.kind } };
|
|
485
|
+
}
|
|
486
|
+
if (outcome.kind === "reverted") {
|
|
487
|
+
return {
|
|
488
|
+
code: EXIT.OK,
|
|
489
|
+
configured: true,
|
|
490
|
+
text: `✔ Removed the AI21 Gateway profile from Claude Desktop. ${quitHint(deps.platform)} and reopen it to apply.\n`,
|
|
491
|
+
json: { outcome: outcome.kind, path: outcome.path },
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
return { ...writeFailure(outcome), configured: true };
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
function refused(code, reason, message, stage, why) {
|
|
499
|
+
return {
|
|
500
|
+
code,
|
|
501
|
+
text: `Claude Desktop: ${message}\n${nothingWasWritten()}\n`,
|
|
502
|
+
json: { ok: false, reason },
|
|
503
|
+
failure: { stage, errorMessage: why },
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
function writeFailure(outcome) {
|
|
507
|
+
const code = outcome.kind === "malformed" ? EXIT.MALFORMED : EXIT.INTERNAL;
|
|
508
|
+
const reason = "reason" in outcome ? outcome.reason : outcome.kind;
|
|
509
|
+
return {
|
|
510
|
+
code,
|
|
511
|
+
text: `Claude Desktop: could not write ${outcome.path}: ${reason}.\n`,
|
|
512
|
+
json: { ok: false, path: outcome.path, reason },
|
|
513
|
+
failure: {
|
|
514
|
+
stage: "configWrite",
|
|
515
|
+
errorMessage: outcome.kind === "malformed" ? "existing settings file is malformed" : "settings file could not be written",
|
|
516
|
+
},
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
/** The user's subscription token: CLAUDE_CODE_OAUTH_TOKEN or the stored one, else one `claude setup-token` approval. */
|
|
520
|
+
async function desktopToken(ctx, deps) {
|
|
521
|
+
const check = (token) => {
|
|
522
|
+
if (ctx.noVerify)
|
|
523
|
+
return Promise.resolve({ kind: "disabled" });
|
|
524
|
+
ctx.step("Verifying your Claude login through the gateway…");
|
|
525
|
+
return verifyBearer(token, {
|
|
526
|
+
urls: ctx.urls,
|
|
527
|
+
agentId: ctx.inputs.agentId,
|
|
528
|
+
ai21Key: ctx.inputs.ai21Key,
|
|
529
|
+
userId: ctx.inputs.userId,
|
|
530
|
+
processEnv: ctx.env.processEnv,
|
|
531
|
+
cwd: ctx.env.home,
|
|
532
|
+
}, ctx.deps);
|
|
533
|
+
};
|
|
534
|
+
const existing = oauthToken(ctx.env.processEnv.CLAUDE_CODE_OAUTH_TOKEN) ?? oauthToken(await deps.readToken());
|
|
535
|
+
if (existing !== undefined) {
|
|
536
|
+
const verification = await check(existing);
|
|
537
|
+
// Only a rejected token earns a new approval; a gateway problem would reject the new one too.
|
|
538
|
+
if (verification.kind !== "no-subscription")
|
|
539
|
+
return { token: existing, verification, fresh: false };
|
|
540
|
+
}
|
|
541
|
+
const noToken = (why) => refused(EXIT.NO_SUBSCRIPTION, "no-claude-token", "no token from your Claude account. Run `claude setup-token`, then re-run with CLAUDE_CODE_OAUTH_TOKEN set.", "agentLogin", why);
|
|
542
|
+
if (!ctx.interactive)
|
|
543
|
+
return noToken("no subscription token and no terminal to create one");
|
|
544
|
+
ctx.finished("Opening Claude to approve access for Claude Desktop");
|
|
545
|
+
let token = oauthToken(await deps.setupToken());
|
|
546
|
+
let verification = token === undefined ? undefined : await check(token);
|
|
547
|
+
// Read off the screen wrong, or not at all: ask once rather than send the user back to approve again.
|
|
548
|
+
if (token === undefined || verification?.kind === "no-subscription") {
|
|
549
|
+
token = oauthToken(await deps.pasteToken());
|
|
550
|
+
verification = token === undefined ? undefined : await check(token);
|
|
551
|
+
}
|
|
552
|
+
if (token === undefined || verification === undefined)
|
|
553
|
+
return noToken("setup-token returned no token");
|
|
554
|
+
return { token, verification, fresh: true };
|
|
555
|
+
}
|
|
556
|
+
/** Token, verify, then write: a rejected setup must not leave Desktop unable to answer. */
|
|
557
|
+
async function installDesktop(ctx, deps, paths) {
|
|
558
|
+
const got = await desktopToken(ctx, deps);
|
|
559
|
+
if ("code" in got)
|
|
560
|
+
return got;
|
|
561
|
+
const { token, verification } = got;
|
|
562
|
+
if (verification.kind === "failed" || verification.kind === "no-subscription") {
|
|
563
|
+
const reason = verification.kind === "failed" ? verification.reason : "your Claude token was rejected";
|
|
564
|
+
// A just-created token that fails was most likely misread off the screen.
|
|
565
|
+
const hint = got.fresh && verification.kind === "no-subscription"
|
|
566
|
+
? " Re-run with CLAUDE_CODE_OAUTH_TOKEN set to the token shown above."
|
|
567
|
+
: "";
|
|
568
|
+
return refused(EXIT.VERIFY_FAILED, reason, `the gateway did not accept the request: ${reason}.${hint}`, "verify", "verification request failed");
|
|
569
|
+
}
|
|
570
|
+
if (verification.kind === "passed")
|
|
571
|
+
ctx.finished("Verified your Claude login through the gateway");
|
|
572
|
+
try {
|
|
573
|
+
if ((await deps.readToken()) !== token)
|
|
574
|
+
await deps.storeToken(token);
|
|
575
|
+
}
|
|
576
|
+
catch {
|
|
577
|
+
return refused(EXIT.INTERNAL, "keychain", "could not store the Claude token.", "configWrite", "token store failed");
|
|
578
|
+
}
|
|
579
|
+
ctx.step("Writing the Claude Desktop gateway profile…");
|
|
580
|
+
const outcome = writeDesktopConfig(paths, ctx.inputs);
|
|
581
|
+
if (outcome.kind !== "written")
|
|
582
|
+
return writeFailure(outcome);
|
|
583
|
+
ctx.finished("Claude Desktop gateway profile written");
|
|
584
|
+
// Run from inside Desktop, a restart would kill this process mid-way.
|
|
585
|
+
const inside = ctx.env.processEnv.CLAUDE_CODE_ENTRYPOINT === "claude-desktop";
|
|
586
|
+
let launch = "skipped";
|
|
587
|
+
if (!inside) {
|
|
588
|
+
ctx.step("Restarting Claude Desktop…");
|
|
589
|
+
launch = await relaunchDesktop(deps);
|
|
590
|
+
}
|
|
591
|
+
return {
|
|
592
|
+
code: EXIT.OK,
|
|
593
|
+
text: `✔ Claude Desktop now routes through ${ctx.inputs.gatewayUrl} on your Claude subscription\n profile: ${outcome.path}\n${launchLine(launch, deps.platform)}\n`,
|
|
594
|
+
json: { ok: true, path: outcome.path, verification: verification.kind, launch },
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
/** How to quit Desktop by hand: on Windows closing the window only sends it to the tray. */
|
|
598
|
+
function quitHint(platform) {
|
|
599
|
+
return platform === "win32" ? "Quit it from the tray icon" : "Quit it (⌘Q)";
|
|
600
|
+
}
|
|
601
|
+
function launchLine(launch, platform) {
|
|
602
|
+
switch (launch) {
|
|
603
|
+
case "opened":
|
|
604
|
+
return "Opened Claude Desktop.";
|
|
605
|
+
case "restarted":
|
|
606
|
+
return "Restarted Claude Desktop.";
|
|
607
|
+
case "still-running":
|
|
608
|
+
return `Claude Desktop did not quit. ${quitHint(platform)} and reopen it to apply the gateway.`;
|
|
609
|
+
case "open-failed":
|
|
610
|
+
return "Could not open Claude Desktop. Open it to apply the gateway.";
|
|
611
|
+
case "skipped":
|
|
612
|
+
return `${quitHint(platform)} and reopen Claude Desktop to apply the gateway.`;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
//# sourceMappingURL=desktop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../../src/agents/claude-code/desktop.ts"],"names":[],"mappings":"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"}
|