@hypeitnow/opencode-claude-auth 1.6.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/LICENSE +21 -0
- package/README.md +238 -0
- package/dist/anthropic-prompt.txt +166 -0
- package/dist/betas.d.ts +9 -0
- package/dist/betas.d.ts.map +1 -0
- package/dist/betas.js +102 -0
- package/dist/betas.js.map +1 -0
- package/dist/credentials.d.ts +29 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +313 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +495 -0
- package/dist/index.js.map +1 -0
- package/dist/keychain.d.ts +23 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +365 -0
- package/dist/keychain.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +74 -0
- package/dist/logger.js.map +1 -0
- package/dist/model-config.d.ts +22 -0
- package/dist/model-config.d.ts.map +1 -0
- package/dist/model-config.js +44 -0
- package/dist/model-config.js.map +1 -0
- package/dist/oauth.d.ts +31 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +158 -0
- package/dist/oauth.js.map +1 -0
- package/dist/pkce.d.ts +6 -0
- package/dist/pkce.d.ts.map +1 -0
- package/dist/pkce.js +23 -0
- package/dist/pkce.js.map +1 -0
- package/dist/plugin-config.d.ts +45 -0
- package/dist/plugin-config.d.ts.map +1 -0
- package/dist/plugin-config.js +66 -0
- package/dist/plugin-config.js.map +1 -0
- package/dist/signing.d.ts +31 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +55 -0
- package/dist/signing.js.map +1 -0
- package/dist/transforms.d.ts +14 -0
- package/dist/transforms.d.ts.map +1 -0
- package/dist/transforms.js +271 -0
- package/dist/transforms.js.map +1 -0
- package/installation.md +98 -0
- package/opencode-claude-auth.js +2 -0
- package/package.json +79 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { config } from "./model-config.js";
|
|
3
|
+
import { readAllClaudeAccounts } from "./keychain.js";
|
|
4
|
+
import { initLogger, log } from "./logger.js";
|
|
5
|
+
import { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
|
|
6
|
+
import { transformBody, transformResponseStream } from "./transforms.js";
|
|
7
|
+
import { applyOpencodeConfig } from "./plugin-config.js";
|
|
8
|
+
import { getCachedCredentials, getCredentialsForSync, syncAuthJson, initAccounts, setActiveAccountSource, loadPersistedAccountSource, saveAccountSource, refreshAccountsList, } from "./credentials.js";
|
|
9
|
+
import { buildAuthorizationUrl, exchangeCode, refreshTokens } from "./oauth.js";
|
|
10
|
+
export { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
|
|
11
|
+
export { resetExcludedBetas } from "./betas.js";
|
|
12
|
+
export { stripToolPrefix, transformBody, transformResponseStream, } from "./transforms.js";
|
|
13
|
+
export { getCachedCredentials, syncAuthJson, refreshAccountsList, } from "./credentials.js";
|
|
14
|
+
export { isEnable1mContext } from "./plugin-config.js";
|
|
15
|
+
export { buildBillingHeaderValue, computeCch, computeVersionSuffix, extractFirstUserMessageText, } from "./signing.js";
|
|
16
|
+
const SYSTEM_IDENTITY_PREFIX = "You are Claude Code, Anthropic's official CLI for Claude.";
|
|
17
|
+
function getCliVersion() {
|
|
18
|
+
return process.env.ANTHROPIC_CLI_VERSION ?? config.ccVersion;
|
|
19
|
+
}
|
|
20
|
+
function getUserAgent() {
|
|
21
|
+
return (process.env.ANTHROPIC_USER_AGENT ??
|
|
22
|
+
`claude-cli/${getCliVersion()} (external, sdk-cli)`);
|
|
23
|
+
}
|
|
24
|
+
function getStainlessHeaders() {
|
|
25
|
+
return {
|
|
26
|
+
"x-stainless-arch": process.arch === "arm64" ? "arm64" : process.arch,
|
|
27
|
+
"x-stainless-lang": "js",
|
|
28
|
+
"x-stainless-os": process.platform === "darwin" ? "MacOS" : process.platform,
|
|
29
|
+
"x-stainless-package-version": "0.81.0",
|
|
30
|
+
"x-stainless-retry-count": "0",
|
|
31
|
+
"x-stainless-runtime": "node",
|
|
32
|
+
"x-stainless-runtime-version": process.version,
|
|
33
|
+
"x-stainless-timeout": "600",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function buildRequestUrl(input) {
|
|
37
|
+
const raw = typeof input === "string"
|
|
38
|
+
? input
|
|
39
|
+
: input instanceof URL
|
|
40
|
+
? input.toString()
|
|
41
|
+
: input.url;
|
|
42
|
+
const url = new URL(raw);
|
|
43
|
+
if (url.pathname === "/v1/messages" && !url.searchParams.has("beta")) {
|
|
44
|
+
url.searchParams.set("beta", "true");
|
|
45
|
+
}
|
|
46
|
+
return typeof input === "string" ? url.toString() : url;
|
|
47
|
+
}
|
|
48
|
+
// Stable per-process session ID, matching Claude Code's X-Claude-Code-Session-Id
|
|
49
|
+
const sessionId = crypto.randomUUID();
|
|
50
|
+
// Maximum delay before we give up retrying and surface the error.
|
|
51
|
+
// A retry-after longer than this signals a quota/usage-limit reset (hours away)
|
|
52
|
+
// rather than a transient rate limit — retrying would hang indefinitely.
|
|
53
|
+
// Override with OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS for longer retry windows.
|
|
54
|
+
const DEFAULT_MAX_RETRY_DELAY_MS = 30_000;
|
|
55
|
+
function getMaxRetryDelayMs() {
|
|
56
|
+
const env = process.env.OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS;
|
|
57
|
+
if (env) {
|
|
58
|
+
const parsed = parseInt(env, 10);
|
|
59
|
+
if (!Number.isNaN(parsed) && parsed > 0)
|
|
60
|
+
return parsed;
|
|
61
|
+
}
|
|
62
|
+
return DEFAULT_MAX_RETRY_DELAY_MS;
|
|
63
|
+
}
|
|
64
|
+
export async function fetchWithRetry(input, init, retries = 3, fetchImpl = fetch) {
|
|
65
|
+
for (let i = 0; i < retries; i++) {
|
|
66
|
+
const res = await fetchImpl(input, init);
|
|
67
|
+
if ((res.status === 429 || res.status === 529) && i < retries - 1) {
|
|
68
|
+
const retryAfter = res.headers.get("retry-after");
|
|
69
|
+
const parsed = retryAfter ? parseInt(retryAfter, 10) : NaN;
|
|
70
|
+
const delay = Number.isNaN(parsed) ? (i + 1) * 2000 : parsed * 1000;
|
|
71
|
+
// If delay exceeds the cap, the server is signalling a quota/usage-limit
|
|
72
|
+
// reset far in the future. Return immediately so the error surfaces to
|
|
73
|
+
// the user rather than silently hanging until the reset time.
|
|
74
|
+
if (delay > getMaxRetryDelayMs()) {
|
|
75
|
+
log("fetch_rate_limited_quota", {
|
|
76
|
+
status: res.status,
|
|
77
|
+
retryAfter: retryAfter ?? "none",
|
|
78
|
+
delayMs: delay,
|
|
79
|
+
});
|
|
80
|
+
return res;
|
|
81
|
+
}
|
|
82
|
+
log("fetch_rate_limited", {
|
|
83
|
+
status: res.status,
|
|
84
|
+
attempt: i + 1,
|
|
85
|
+
retryAfter: retryAfter ?? "none",
|
|
86
|
+
delayMs: delay,
|
|
87
|
+
});
|
|
88
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
return res;
|
|
92
|
+
}
|
|
93
|
+
return fetchImpl(input, init);
|
|
94
|
+
}
|
|
95
|
+
export function buildRequestHeaders(input, init, accessToken, modelId = "unknown", excludedBetas) {
|
|
96
|
+
const headers = new Headers();
|
|
97
|
+
if (input instanceof Request) {
|
|
98
|
+
input.headers.forEach((value, key) => {
|
|
99
|
+
headers.set(key, value);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (init.headers instanceof Headers) {
|
|
103
|
+
init.headers.forEach((value, key) => {
|
|
104
|
+
headers.set(key, value);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else if (Array.isArray(init.headers)) {
|
|
108
|
+
for (const [key, value] of init.headers) {
|
|
109
|
+
if (typeof value !== "undefined") {
|
|
110
|
+
headers.set(key, String(value));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (init.headers) {
|
|
115
|
+
for (const [key, value] of Object.entries(init.headers)) {
|
|
116
|
+
if (typeof value !== "undefined") {
|
|
117
|
+
headers.set(key, String(value));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const modelBetas = getModelBetas(modelId, excludedBetas);
|
|
122
|
+
const incomingBeta = headers.get("anthropic-beta") ?? "";
|
|
123
|
+
const mergedBetas = [
|
|
124
|
+
...new Set([
|
|
125
|
+
...modelBetas,
|
|
126
|
+
...incomingBeta
|
|
127
|
+
.split(",")
|
|
128
|
+
.map((item) => item.trim())
|
|
129
|
+
.filter(Boolean),
|
|
130
|
+
]),
|
|
131
|
+
];
|
|
132
|
+
headers.set("authorization", `Bearer ${accessToken}`);
|
|
133
|
+
headers.set("anthropic-version", "2023-06-01");
|
|
134
|
+
headers.set("anthropic-beta", mergedBetas.join(","));
|
|
135
|
+
headers.set("anthropic-dangerous-direct-browser-access", "true");
|
|
136
|
+
headers.set("x-app", "cli");
|
|
137
|
+
headers.set("user-agent", getUserAgent());
|
|
138
|
+
headers.set("x-client-request-id", crypto.randomUUID());
|
|
139
|
+
headers.set("X-Claude-Code-Session-Id", sessionId);
|
|
140
|
+
for (const [key, value] of Object.entries(getStainlessHeaders())) {
|
|
141
|
+
if (!headers.has(key))
|
|
142
|
+
headers.set(key, value);
|
|
143
|
+
}
|
|
144
|
+
headers.delete("x-api-key");
|
|
145
|
+
return headers;
|
|
146
|
+
}
|
|
147
|
+
const SYNC_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
148
|
+
const plugin = async ({ client }) => {
|
|
149
|
+
initLogger();
|
|
150
|
+
let accounts = [];
|
|
151
|
+
try {
|
|
152
|
+
accounts = readAllClaudeAccounts();
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
156
|
+
log("plugin_init_error", { error });
|
|
157
|
+
console.warn("opencode-claude-auth: Failed to read Claude Code credentials:", error);
|
|
158
|
+
return {};
|
|
159
|
+
}
|
|
160
|
+
initAccounts(accounts);
|
|
161
|
+
const defaultAccountSource = accounts[0]?.source ?? null;
|
|
162
|
+
if (accounts.length > 0) {
|
|
163
|
+
const persistedSource = loadPersistedAccountSource();
|
|
164
|
+
const defaultAccount = (persistedSource && accounts.find((a) => a.source === persistedSource)) ||
|
|
165
|
+
accounts[0];
|
|
166
|
+
setActiveAccountSource(defaultAccount.source);
|
|
167
|
+
log("plugin_init", {
|
|
168
|
+
accountCount: accounts.length,
|
|
169
|
+
sources: accounts.map((a) => a.source),
|
|
170
|
+
activeSource: defaultAccount.source,
|
|
171
|
+
});
|
|
172
|
+
const initialCreds = getCachedCredentials();
|
|
173
|
+
if (initialCreds) {
|
|
174
|
+
syncAuthJson(initialCreds);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.warn("opencode-claude-auth: Claude credentials are expired and could not be refreshed. Run `claude` to re-authenticate.");
|
|
178
|
+
}
|
|
179
|
+
// Keep auth.json synced with current credentials (no refresh triggered)
|
|
180
|
+
const syncTimer = setInterval(() => {
|
|
181
|
+
try {
|
|
182
|
+
const creds = getCredentialsForSync();
|
|
183
|
+
if (creds)
|
|
184
|
+
syncAuthJson(creds);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Non-fatal
|
|
188
|
+
}
|
|
189
|
+
}, SYNC_INTERVAL);
|
|
190
|
+
syncTimer.unref();
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
log("plugin_init_no_accounts", { reason: "no credentials found" });
|
|
194
|
+
console.warn("opencode-claude-auth: No Claude Code credentials found. Running in API key mode with transform hook enabled.");
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
config: async (opencodeConfig) => {
|
|
198
|
+
applyOpencodeConfig(opencodeConfig);
|
|
199
|
+
},
|
|
200
|
+
"experimental.chat.system.transform": async (input, output) => {
|
|
201
|
+
if (input.model?.providerID !== "anthropic") {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const hasIdentityPrefix = output.system.some((entry) => entry.includes(SYSTEM_IDENTITY_PREFIX));
|
|
205
|
+
if (!hasIdentityPrefix) {
|
|
206
|
+
output.system.unshift(SYSTEM_IDENTITY_PREFIX);
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
auth: {
|
|
210
|
+
provider: "anthropic",
|
|
211
|
+
async loader(getAuth, provider) {
|
|
212
|
+
const auth = await getAuth();
|
|
213
|
+
log("auth_loader_called", { authType: auth.type });
|
|
214
|
+
if (auth.type !== "oauth") {
|
|
215
|
+
log("auth_loader_skipped", {
|
|
216
|
+
authType: auth.type,
|
|
217
|
+
reason: "auth type is not oauth",
|
|
218
|
+
});
|
|
219
|
+
return {};
|
|
220
|
+
}
|
|
221
|
+
for (const model of Object.values(provider.models)) {
|
|
222
|
+
model.cost = {
|
|
223
|
+
input: 0,
|
|
224
|
+
output: 0,
|
|
225
|
+
cache: { read: 0, write: 0 },
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
log("auth_loader_ready", {
|
|
229
|
+
modelCount: Object.keys(provider.models).length,
|
|
230
|
+
});
|
|
231
|
+
return {
|
|
232
|
+
apiKey: "",
|
|
233
|
+
baseURL: "https://api.anthropic.com/v1",
|
|
234
|
+
async fetch(input, init) {
|
|
235
|
+
const latest = getCachedCredentials();
|
|
236
|
+
if (!latest) {
|
|
237
|
+
log("fetch_no_credentials", { modelId: "unknown" });
|
|
238
|
+
throw new Error("Claude Code credentials are unavailable or expired. Run `claude` to refresh them.");
|
|
239
|
+
}
|
|
240
|
+
const requestInit = init ?? {};
|
|
241
|
+
const bodyStr = typeof requestInit.body === "string"
|
|
242
|
+
? requestInit.body
|
|
243
|
+
: undefined;
|
|
244
|
+
let modelId = "unknown";
|
|
245
|
+
if (bodyStr) {
|
|
246
|
+
try {
|
|
247
|
+
modelId =
|
|
248
|
+
JSON.parse(bodyStr).model ?? "unknown";
|
|
249
|
+
}
|
|
250
|
+
catch { }
|
|
251
|
+
}
|
|
252
|
+
log("fetch_credentials", {
|
|
253
|
+
modelId,
|
|
254
|
+
accessToken: latest.accessToken,
|
|
255
|
+
expiresAt: latest.expiresAt,
|
|
256
|
+
});
|
|
257
|
+
// Get excluded betas for this model (from previous failed requests)
|
|
258
|
+
const excluded = getExcludedBetas(modelId);
|
|
259
|
+
const requestUrl = buildRequestUrl(input);
|
|
260
|
+
const headers = buildRequestHeaders(input, requestInit, latest.accessToken, modelId, excluded);
|
|
261
|
+
const body = transformBody(requestInit.body);
|
|
262
|
+
const headerKeys = [];
|
|
263
|
+
headers.forEach((_, key) => headerKeys.push(key));
|
|
264
|
+
const betas = (headers.get("anthropic-beta") ?? "")
|
|
265
|
+
.split(",")
|
|
266
|
+
.filter(Boolean);
|
|
267
|
+
log("fetch_headers_built", { headerKeys, betas, modelId });
|
|
268
|
+
let response = await fetchWithRetry(requestUrl, {
|
|
269
|
+
...requestInit,
|
|
270
|
+
body,
|
|
271
|
+
headers,
|
|
272
|
+
});
|
|
273
|
+
log("fetch_response", {
|
|
274
|
+
status: response.status,
|
|
275
|
+
modelId,
|
|
276
|
+
retryAttempt: 0,
|
|
277
|
+
});
|
|
278
|
+
// On 401, force a credential refresh and retry once.
|
|
279
|
+
// Two refresh paths are attempted in order:
|
|
280
|
+
// 1. Refresh via stored OAuth refresh token (if available)
|
|
281
|
+
// 2. Re-read credentials from Keychain (in case the user ran
|
|
282
|
+
// `claude` to re-authenticate and a new value is now in
|
|
283
|
+
// the keychain)
|
|
284
|
+
// After both fail, the user is instructed to run `opencode auth`
|
|
285
|
+
// and pick "Claude OAuth (fallback)" to authorize via OAuth.
|
|
286
|
+
if (response.status === 401) {
|
|
287
|
+
log("fetch_401_retry", { modelId });
|
|
288
|
+
// Path 1: OAuth refresh-token flow (only if we have a refresh
|
|
289
|
+
// token and the access token we just used was not a raw key
|
|
290
|
+
// that already failed).
|
|
291
|
+
const currentAuth = await getAuth();
|
|
292
|
+
if (currentAuth.type === "oauth" &&
|
|
293
|
+
currentAuth.refresh &&
|
|
294
|
+
latest.accessToken !== currentAuth.access) {
|
|
295
|
+
// Stale oauth: try to refresh.
|
|
296
|
+
const refreshed = await refreshTokens(currentAuth.refresh);
|
|
297
|
+
if (refreshed.type === "success") {
|
|
298
|
+
await client.auth.set({
|
|
299
|
+
path: { id: "anthropic" },
|
|
300
|
+
body: {
|
|
301
|
+
type: "oauth",
|
|
302
|
+
access: refreshed.access,
|
|
303
|
+
refresh: refreshed.refresh,
|
|
304
|
+
expires: refreshed.expires,
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
log("fetch_401_oauth_refreshed", { modelId });
|
|
308
|
+
const retryHeaders = buildRequestHeaders(input, requestInit, refreshed.access, modelId, excluded);
|
|
309
|
+
response = await fetchWithRetry(requestUrl, {
|
|
310
|
+
...requestInit,
|
|
311
|
+
body,
|
|
312
|
+
headers: retryHeaders,
|
|
313
|
+
});
|
|
314
|
+
log("fetch_401_retry_result", {
|
|
315
|
+
status: response.status,
|
|
316
|
+
modelId,
|
|
317
|
+
path: "oauth_refresh",
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
log("fetch_401_oauth_refresh_failed", { modelId });
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// Path 2: re-read keychain in case the user re-ran `claude`
|
|
326
|
+
// mid-session.
|
|
327
|
+
const refreshed = getCachedCredentials();
|
|
328
|
+
if (refreshed && refreshed.accessToken !== latest.accessToken) {
|
|
329
|
+
const retryHeaders = buildRequestHeaders(input, requestInit, refreshed.accessToken, modelId, excluded);
|
|
330
|
+
response = await fetchWithRetry(requestUrl, {
|
|
331
|
+
...requestInit,
|
|
332
|
+
body,
|
|
333
|
+
headers: retryHeaders,
|
|
334
|
+
});
|
|
335
|
+
log("fetch_401_retry_result", {
|
|
336
|
+
status: response.status,
|
|
337
|
+
modelId,
|
|
338
|
+
path: "keychain_reread",
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
log("fetch_401_no_refresh_available", { modelId });
|
|
343
|
+
console.warn(`opencode-claude-auth: API 401 for ${modelId}. The raw Keychain key was rejected. Run \`opencode auth\` and pick "Claude OAuth (fallback)" to authorize via OAuth.`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Check for long-context beta errors and retry with betas excluded
|
|
348
|
+
// Try up to LONG_CONTEXT_BETAS.length times, excluding one more beta each time
|
|
349
|
+
for (let attempt = 0; attempt < LONG_CONTEXT_BETAS.length; attempt++) {
|
|
350
|
+
if (response.status !== 400 && response.status !== 429) {
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
const cloned = response.clone();
|
|
354
|
+
const responseBody = await cloned.text();
|
|
355
|
+
if (!isLongContextError(responseBody)) {
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
const betaToExclude = getNextBetaToExclude(modelId);
|
|
359
|
+
if (!betaToExclude) {
|
|
360
|
+
break; // All long-context betas already excluded
|
|
361
|
+
}
|
|
362
|
+
addExcludedBeta(modelId, betaToExclude);
|
|
363
|
+
log("fetch_beta_excluded", {
|
|
364
|
+
modelId,
|
|
365
|
+
excludedBeta: betaToExclude,
|
|
366
|
+
});
|
|
367
|
+
// Rebuild headers without the excluded beta and retry
|
|
368
|
+
const currentCreds = getCachedCredentials();
|
|
369
|
+
const retryToken = currentCreds?.accessToken ?? latest.accessToken;
|
|
370
|
+
const newExcluded = getExcludedBetas(modelId);
|
|
371
|
+
const newHeaders = buildRequestHeaders(input, requestInit, retryToken, modelId, newExcluded);
|
|
372
|
+
response = await fetchWithRetry(requestUrl, {
|
|
373
|
+
...requestInit,
|
|
374
|
+
body,
|
|
375
|
+
headers: newHeaders,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
// Log non-200 responses at warn level so they're visible in OpenCode
|
|
379
|
+
if (!response.ok) {
|
|
380
|
+
const status = response.status;
|
|
381
|
+
const cloned = response.clone();
|
|
382
|
+
cloned
|
|
383
|
+
.text()
|
|
384
|
+
.then((errorBody) => {
|
|
385
|
+
let message = errorBody;
|
|
386
|
+
try {
|
|
387
|
+
const parsed = JSON.parse(errorBody);
|
|
388
|
+
message =
|
|
389
|
+
parsed.error?.message ?? parsed.error?.type ?? errorBody;
|
|
390
|
+
}
|
|
391
|
+
catch { }
|
|
392
|
+
log("fetch_error_response", { status, modelId, message });
|
|
393
|
+
console.warn(`opencode-claude-auth: API ${status} for ${modelId}: ${message}`);
|
|
394
|
+
})
|
|
395
|
+
.catch(() => { });
|
|
396
|
+
}
|
|
397
|
+
return transformResponseStream(response);
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
},
|
|
401
|
+
methods: [
|
|
402
|
+
{
|
|
403
|
+
type: "oauth",
|
|
404
|
+
label: "Switch Claude Code account",
|
|
405
|
+
get prompts() {
|
|
406
|
+
const currentAccounts = refreshAccountsList();
|
|
407
|
+
const currentSource = loadPersistedAccountSource() ?? defaultAccountSource;
|
|
408
|
+
if (currentAccounts.length <= 1)
|
|
409
|
+
return [];
|
|
410
|
+
return [
|
|
411
|
+
{
|
|
412
|
+
type: "select",
|
|
413
|
+
key: "account",
|
|
414
|
+
message: "Select which Claude Code account to use:",
|
|
415
|
+
options: currentAccounts.map((a) => ({
|
|
416
|
+
label: a.label,
|
|
417
|
+
value: a.source,
|
|
418
|
+
hint: a.source === currentSource
|
|
419
|
+
? `${a.source} (active)`
|
|
420
|
+
: a.source,
|
|
421
|
+
})),
|
|
422
|
+
},
|
|
423
|
+
];
|
|
424
|
+
},
|
|
425
|
+
async authorize(inputs) {
|
|
426
|
+
const latestAccounts = refreshAccountsList();
|
|
427
|
+
const source = inputs?.account ?? latestAccounts[0]?.source ?? accounts[0].source;
|
|
428
|
+
const chosen = latestAccounts.find((a) => a.source === source) ??
|
|
429
|
+
accounts.find((a) => a.source === source) ??
|
|
430
|
+
latestAccounts[0] ??
|
|
431
|
+
accounts[0];
|
|
432
|
+
setActiveAccountSource(chosen.source);
|
|
433
|
+
const creds = getCachedCredentials() ?? chosen.credentials;
|
|
434
|
+
syncAuthJson(creds);
|
|
435
|
+
saveAccountSource(chosen.source);
|
|
436
|
+
const sourceDescription = chosen.source === "file"
|
|
437
|
+
? "credentials file (~/.claude/.credentials.json)"
|
|
438
|
+
: "macOS Keychain";
|
|
439
|
+
return {
|
|
440
|
+
url: "",
|
|
441
|
+
instructions: `Using ${chosen.label} — credentials loaded from ${sourceDescription}.`,
|
|
442
|
+
method: "auto",
|
|
443
|
+
async callback() {
|
|
444
|
+
return {
|
|
445
|
+
type: "success",
|
|
446
|
+
provider: "anthropic",
|
|
447
|
+
access: creds.accessToken,
|
|
448
|
+
refresh: creds.refreshToken,
|
|
449
|
+
expires: creds.expiresAt,
|
|
450
|
+
};
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
type: "oauth",
|
|
457
|
+
label: "Claude OAuth (fallback)",
|
|
458
|
+
async authorize() {
|
|
459
|
+
log("oauth_fallback_authorize_started", {});
|
|
460
|
+
const { url, verifier, state, redirectUri } = await buildAuthorizationUrl("console");
|
|
461
|
+
return {
|
|
462
|
+
url,
|
|
463
|
+
instructions: "Open the URL above, authorize with your Claude account, then paste the full callback URL (or just `code#state`) here:",
|
|
464
|
+
method: "code",
|
|
465
|
+
async callback(code) {
|
|
466
|
+
log("oauth_fallback_callback_received", { length: code.length });
|
|
467
|
+
const result = await exchangeCode({ code, state: state ?? "" }, verifier, redirectUri, state);
|
|
468
|
+
if (result.type === "failed") {
|
|
469
|
+
log("oauth_fallback_exchange_failed", {});
|
|
470
|
+
return {
|
|
471
|
+
type: "failed",
|
|
472
|
+
error: "OAuth code exchange failed. The code may have expired or the state did not match.",
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
log("oauth_fallback_exchange_success", {
|
|
476
|
+
expiresIn: result.expires - Date.now(),
|
|
477
|
+
});
|
|
478
|
+
return {
|
|
479
|
+
type: "success",
|
|
480
|
+
provider: "anthropic",
|
|
481
|
+
access: result.access,
|
|
482
|
+
refresh: result.refresh,
|
|
483
|
+
expires: result.expires,
|
|
484
|
+
};
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
],
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
};
|
|
493
|
+
export const ClaudeAuthPlugin = plugin;
|
|
494
|
+
export default plugin;
|
|
495
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAsB,MAAM,eAAe,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/E,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,GAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAuB,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAA;AAErB,MAAM,sBAAsB,GAC1B,2DAA2D,CAAA;AAE7D,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,SAAS,CAAA;AAC9D,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,cAAc,aAAa,EAAE,sBAAsB,CACpD,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;QACrE,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EACd,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ;QAC5D,6BAA6B,EAAE,QAAQ;QACvC,yBAAyB,EAAE,GAAG;QAC9B,qBAAqB,EAAE,MAAM;QAC7B,6BAA6B,EAAE,OAAO,CAAC,OAAO;QAC9C,qBAAqB,EAAE,KAAK;KAC7B,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAwB;IAC/C,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,YAAY,GAAG;YACpB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;YAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;IAEjB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AACzD,CAAC;AAED,iFAAiF;AACjF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;AAIrC,kEAAkE;AAClE,gFAAgF;AAChF,yEAAyE;AACzE,4EAA4E;AAC5E,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAEzC,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAA;IACzD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAA;IACxD,CAAC;IACD,OAAO,0BAA0B,CAAA;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAwB,EACxB,IAAkB,EAClB,OAAO,GAAG,CAAC,EACX,YAAqB,KAAK;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YACjD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAA;YACnE,yEAAyE;YACzE,uEAAuE;YACvE,8DAA8D;YAC9D,IAAI,KAAK,GAAG,kBAAkB,EAAE,EAAE,CAAC;gBACjC,GAAG,CAAC,0BAA0B,EAAE;oBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,UAAU,EAAE,UAAU,IAAI,MAAM;oBAChC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAA;gBACF,OAAO,GAAG,CAAA;YACZ,CAAC;YACD,GAAG,CAAC,oBAAoB,EAAE;gBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,UAAU,EAAE,UAAU,IAAI,MAAM;gBAChC,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;YACF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;YAC9C,SAAQ;QACV,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAwB,EACxB,IAAiB,EACjB,WAAmB,EACnB,OAAO,GAAG,SAAS,EACnB,aAA2B;IAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,YAAY,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAA;IACxD,MAAM,WAAW,GAAG;QAClB,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,UAAU;YACb,GAAG,YAAY;iBACZ,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,OAAO,CAAC;SACnB,CAAC;KACH,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,WAAW,EAAE,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC3B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAA;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAE3B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAEhD,MAAM,MAAM,GAAW,KAAK,EAAE,EAAE,MAAM,EAAmB,EAAE,EAAE;IAC3D,UAAU,EAAE,CAAA;IAEZ,IAAI,QAAQ,GAAoB,EAAE,CAAA;IAClC,IAAI,CAAC;QACH,QAAQ,GAAG,qBAAqB,EAAE,CAAA;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9D,GAAG,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QACnC,OAAO,CAAC,IAAI,CACV,+DAA+D,EAC/D,KAAK,CACN,CAAA;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,YAAY,CAAC,QAAQ,CAAC,CAAA;IAEtB,MAAM,oBAAoB,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAA;IAExD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAA;QACpD,MAAM,cAAc,GAClB,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC;YACvE,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEb,sBAAsB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAE7C,GAAG,CAAC,aAAa,EAAE;YACjB,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtC,YAAY,EAAE,cAAc,CAAC,MAAM;SACpC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAA;QAC3C,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,YAAY,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,mHAAmH,CACpH,CAAA;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAA;gBACrC,IAAI,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC,EAAE,aAAa,CAAC,CAAA;QACjB,SAAS,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAA;QAClE,OAAO,CAAC,IAAI,CACV,8GAA8G,CAC/G,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YAC/B,mBAAmB,CAAC,cAAc,CAAC,CAAA;QACrC,CAAC;QACD,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5D,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,KAAK,WAAW,EAAE,CAAC;gBAC5C,OAAM;YACR,CAAC;YAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACrD,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CACvC,CAAA;YACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,WAAW;YACrB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ;gBAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;gBAC5B,GAAG,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBAClD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1B,GAAG,CAAC,qBAAqB,EAAE;wBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,MAAM,EAAE,wBAAwB;qBACjC,CAAC,CAAA;oBACF,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnD,KAAK,CAAC,IAAI,GAAG;wBACX,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC;wBACT,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;qBAC7B,CAAA;gBACH,CAAC;gBAED,GAAG,CAAC,mBAAmB,EAAE;oBACvB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM;iBAChD,CAAC,CAAA;gBAEF,OAAO;oBACL,MAAM,EAAE,EAAE;oBACV,OAAO,EAAE,8BAA8B;oBACvC,KAAK,CAAC,KAAK,CAAC,KAAwB,EAAE,IAAkB;wBACtD,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAA;wBACrC,IAAI,CAAC,MAAM,EAAE,CAAC;4BACZ,GAAG,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;4BACnD,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAA;wBACH,CAAC;wBAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAA;wBAC9B,MAAM,OAAO,GACX,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ;4BAClC,CAAC,CAAC,WAAW,CAAC,IAAI;4BAClB,CAAC,CAAC,SAAS,CAAA;wBACf,IAAI,OAAO,GAAG,SAAS,CAAA;wBACvB,IAAI,OAAO,EAAE,CAAC;4BACZ,IAAI,CAAC;gCACH,OAAO;oCACJ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC,KAAK,IAAI,SAAS,CAAA;4BAClE,CAAC;4BAAC,MAAM,CAAC,CAAA,CAAC;wBACZ,CAAC;wBAED,GAAG,CAAC,mBAAmB,EAAE;4BACvB,OAAO;4BACP,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;yBAC5B,CAAC,CAAA;wBAEF,oEAAoE;wBACpE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;wBAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;wBACzC,MAAM,OAAO,GAAG,mBAAmB,CACjC,KAAK,EACL,WAAW,EACX,MAAM,CAAC,WAAW,EAClB,OAAO,EACP,QAAQ,CACT,CAAA;wBACD,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;wBAE5C,MAAM,UAAU,GAAa,EAAE,CAAA;wBAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;wBACjD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;6BAChD,KAAK,CAAC,GAAG,CAAC;6BACV,MAAM,CAAC,OAAO,CAAC,CAAA;wBAClB,GAAG,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;wBAE1D,IAAI,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE;4BAC9C,GAAG,WAAW;4BACd,IAAI;4BACJ,OAAO;yBACR,CAAC,CAAA;wBAEF,GAAG,CAAC,gBAAgB,EAAE;4BACpB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,OAAO;4BACP,YAAY,EAAE,CAAC;yBAChB,CAAC,CAAA;wBAEF,qDAAqD;wBACrD,4CAA4C;wBAC5C,6DAA6D;wBAC7D,+DAA+D;wBAC/D,6DAA6D;wBAC7D,qBAAqB;wBACrB,iEAAiE;wBACjE,6DAA6D;wBAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;4BAC5B,GAAG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;4BAEnC,8DAA8D;4BAC9D,4DAA4D;4BAC5D,wBAAwB;4BACxB,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAA;4BACnC,IACE,WAAW,CAAC,IAAI,KAAK,OAAO;gCAC5B,WAAW,CAAC,OAAO;gCACnB,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,MAAM,EACzC,CAAC;gCACD,+BAA+B;gCAC/B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;gCAC1D,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oCACjC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;wCACpB,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;wCACzB,IAAI,EAAE;4CACJ,IAAI,EAAE,OAAO;4CACb,MAAM,EAAE,SAAS,CAAC,MAAM;4CACxB,OAAO,EAAE,SAAS,CAAC,OAAO;4CAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;yCAC3B;qCACF,CAAC,CAAA;oCACF,GAAG,CAAC,2BAA2B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;oCAC7C,MAAM,YAAY,GAAG,mBAAmB,CACtC,KAAK,EACL,WAAW,EACX,SAAS,CAAC,MAAM,EAChB,OAAO,EACP,QAAQ,CACT,CAAA;oCACD,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE;wCAC1C,GAAG,WAAW;wCACd,IAAI;wCACJ,OAAO,EAAE,YAAY;qCACtB,CAAC,CAAA;oCACF,GAAG,CAAC,wBAAwB,EAAE;wCAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;wCACvB,OAAO;wCACP,IAAI,EAAE,eAAe;qCACtB,CAAC,CAAA;gCACJ,CAAC;qCAAM,CAAC;oCACN,GAAG,CAAC,gCAAgC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;gCACpD,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,4DAA4D;gCAC5D,eAAe;gCACf,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAA;gCACxC,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;oCAC9D,MAAM,YAAY,GAAG,mBAAmB,CACtC,KAAK,EACL,WAAW,EACX,SAAS,CAAC,WAAW,EACrB,OAAO,EACP,QAAQ,CACT,CAAA;oCACD,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE;wCAC1C,GAAG,WAAW;wCACd,IAAI;wCACJ,OAAO,EAAE,YAAY;qCACtB,CAAC,CAAA;oCACF,GAAG,CAAC,wBAAwB,EAAE;wCAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;wCACvB,OAAO;wCACP,IAAI,EAAE,iBAAiB;qCACxB,CAAC,CAAA;gCACJ,CAAC;qCAAM,CAAC;oCACN,GAAG,CAAC,gCAAgC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;oCAClD,OAAO,CAAC,IAAI,CACV,qCAAqC,OAAO,uHAAuH,CACpK,CAAA;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,mEAAmE;wBACnE,+EAA+E;wBAC/E,KACE,IAAI,OAAO,GAAG,CAAC,EACf,OAAO,GAAG,kBAAkB,CAAC,MAAM,EACnC,OAAO,EAAE,EACT,CAAC;4BACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gCACvD,MAAK;4BACP,CAAC;4BAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAA;4BAC/B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;4BAExC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;gCACtC,MAAK;4BACP,CAAC;4BAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;4BACnD,IAAI,CAAC,aAAa,EAAE,CAAC;gCACnB,MAAK,CAAC,0CAA0C;4BAClD,CAAC;4BAED,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;4BACvC,GAAG,CAAC,qBAAqB,EAAE;gCACzB,OAAO;gCACP,YAAY,EAAE,aAAa;6BAC5B,CAAC,CAAA;4BAEF,sDAAsD;4BACtD,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAA;4BAC3C,MAAM,UAAU,GAAG,YAAY,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAAA;4BAClE,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;4BAC7C,MAAM,UAAU,GAAG,mBAAmB,CACpC,KAAK,EACL,WAAW,EACX,UAAU,EACV,OAAO,EACP,WAAW,CACZ,CAAA;4BAED,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE;gCAC1C,GAAG,WAAW;gCACd,IAAI;gCACJ,OAAO,EAAE,UAAU;6BACpB,CAAC,CAAA;wBACJ,CAAC;wBAED,qEAAqE;wBACrE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;4BACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;4BAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAA;4BAC/B,MAAM;iCACH,IAAI,EAAE;iCACN,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;gCAClB,IAAI,OAAO,GAAG,SAAS,CAAA;gCACvB,IAAI,CAAC;oCACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAElC,CAAA;oCACD,OAAO;wCACL,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS,CAAA;gCAC5D,CAAC;gCAAC,MAAM,CAAC,CAAA,CAAC;gCACV,GAAG,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;gCACzD,OAAO,CAAC,IAAI,CACV,6BAA6B,MAAM,QAAQ,OAAO,KAAK,OAAO,EAAE,CACjE,CAAA;4BACH,CAAC,CAAC;iCACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;wBACpB,CAAC;wBAED,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAA;oBAC1C,CAAC;iBACF,CAAA;YACH,CAAC;YACD,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,4BAA4B;oBAEnC,IAAI,OAAO;wBACT,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAA;wBAC7C,MAAM,aAAa,GACjB,0BAA0B,EAAE,IAAI,oBAAoB,CAAA;wBACtD,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC;4BAAE,OAAO,EAAE,CAAA;wBAC1C,OAAO;4BACL;gCACE,IAAI,EAAE,QAAiB;gCACvB,GAAG,EAAE,SAAS;gCACd,OAAO,EAAE,0CAA0C;gCACnD,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCACnC,KAAK,EAAE,CAAC,CAAC,KAAK;oCACd,KAAK,EAAE,CAAC,CAAC,MAAM;oCACf,IAAI,EACF,CAAC,CAAC,MAAM,KAAK,aAAa;wCACxB,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,WAAW;wCACxB,CAAC,CAAC,CAAC,CAAC,MAAM;iCACf,CAAC,CAAC;6BACJ;yBACF,CAAA;oBACH,CAAC;oBAED,KAAK,CAAC,SAAS,CAAC,MAAM;wBACpB,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAA;wBAE5C,MAAM,MAAM,GACV,MAAM,EAAE,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;wBACpE,MAAM,MAAM,GACV,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;4BAC/C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;4BACzC,cAAc,CAAC,CAAC,CAAC;4BACjB,QAAQ,CAAC,CAAC,CAAC,CAAA;wBAEb,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;wBACrC,MAAM,KAAK,GAAG,oBAAoB,EAAE,IAAI,MAAM,CAAC,WAAW,CAAA;wBAE1D,YAAY,CAAC,KAAK,CAAC,CAAA;wBACnB,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;wBAEhC,MAAM,iBAAiB,GACrB,MAAM,CAAC,MAAM,KAAK,MAAM;4BACtB,CAAC,CAAC,gDAAgD;4BAClD,CAAC,CAAC,gBAAgB,CAAA;wBAEtB,OAAO;4BACL,GAAG,EAAE,EAAE;4BACP,YAAY,EAAE,SAAS,MAAM,CAAC,KAAK,8BAA8B,iBAAiB,GAAG;4BACrF,MAAM,EAAE,MAAM;4BACd,KAAK,CAAC,QAAQ;gCACZ,OAAO;oCACL,IAAI,EAAE,SAAS;oCACf,QAAQ,EAAE,WAAW;oCACrB,MAAM,EAAE,KAAK,CAAC,WAAW;oCACzB,OAAO,EAAE,KAAK,CAAC,YAAY;oCAC3B,OAAO,EAAE,KAAK,CAAC,SAAS;iCACzB,CAAA;4BACH,CAAC;yBACF,CAAA;oBACH,CAAC;iBACF;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,yBAAyB;oBAEhC,KAAK,CAAC,SAAS;wBACb,GAAG,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAA;wBAC3C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GACzC,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAA;wBAExC,OAAO;4BACL,GAAG;4BACH,YAAY,EACV,uHAAuH;4BACzH,MAAM,EAAE,MAAM;4BACd,KAAK,CAAC,QAAQ,CAAC,IAAY;gCACzB,GAAG,CAAC,kCAAkC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;gCAChE,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,EAC5B,QAAQ,EACR,WAAW,EACX,KAAK,CACN,CAAA;gCACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oCAC7B,GAAG,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAA;oCACzC,OAAO;wCACL,IAAI,EAAE,QAAiB;wCACvB,KAAK,EAAE,mFAAmF;qCAC3F,CAAA;gCACH,CAAC;gCACD,GAAG,CAAC,iCAAiC,EAAE;oCACrC,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;iCACvC,CAAC,CAAA;gCACF,OAAO;oCACL,IAAI,EAAE,SAAkB;oCACxB,QAAQ,EAAE,WAAW;oCACrB,MAAM,EAAE,MAAM,CAAC,MAAM;oCACrB,OAAO,EAAE,MAAM,CAAC,OAAO;oCACvB,OAAO,EAAE,MAAM,CAAC,OAAO;iCACxB,CAAA;4BACH,CAAC;yBACF,CAAA;oBACH,CAAC;iBACF;aACF;SACF;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAA;AACtC,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ClaudeCredentials {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
subscriptionType?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ClaudeAccount {
|
|
8
|
+
label: string;
|
|
9
|
+
source: string;
|
|
10
|
+
credentials: ClaudeCredentials;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildAccountLabels(credsList: ClaudeCredentials[]): string[];
|
|
13
|
+
export declare function readAllClaudeAccounts(): ClaudeAccount[];
|
|
14
|
+
export declare function updateCredentialBlob(existingJson: string, newCreds: {
|
|
15
|
+
accessToken: string;
|
|
16
|
+
refreshToken: string;
|
|
17
|
+
expiresAt: number;
|
|
18
|
+
}): string | null;
|
|
19
|
+
export declare function writeBackCredentials(source: string, creds: ClaudeCredentials): boolean;
|
|
20
|
+
export declare function refreshAccount(source: string): ClaudeCredentials | null;
|
|
21
|
+
/** @deprecated Use readAllClaudeAccounts() instead */
|
|
22
|
+
export declare function readClaudeCredentials(): ClaudeCredentials | null;
|
|
23
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAuOD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAoB3E;AAED,wBAAgB,qBAAqB,IAAI,aAAa,EAAE,CA+BvD;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzE,MAAM,GAAG,IAAI,CAgBf;AAuBD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAqET;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAOvE;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAGhE"}
|