opencode-claude-auth 2.1.4 → 2.1.5

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/dist/http.js ADDED
@@ -0,0 +1,74 @@
1
+ import { log } from "./logger.js";
2
+ // Maximum delay before we give up retrying and surface the error.
3
+ // A retry-after longer than this signals a quota/usage-limit reset (hours away)
4
+ // rather than a transient rate limit — retrying would hang indefinitely.
5
+ // Override with OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS for longer retry windows.
6
+ const DEFAULT_MAX_RETRY_DELAY_MS = 30_000;
7
+ function getMaxRetryDelayMs() {
8
+ const env = process.env.OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS;
9
+ if (env) {
10
+ const parsed = parseInt(env, 10);
11
+ if (!Number.isNaN(parsed) && parsed > 0)
12
+ return parsed;
13
+ }
14
+ return DEFAULT_MAX_RETRY_DELAY_MS;
15
+ }
16
+ /**
17
+ * Waits `ms`, or resolves early if the caller's signal aborts. A plain
18
+ * setTimeout would let a capped backoff outlast the timeout the caller
19
+ * bounded the whole request with.
20
+ */
21
+ function sleepUnlessAborted(ms, signal) {
22
+ return new Promise((resolve) => {
23
+ if (signal?.aborted) {
24
+ resolve();
25
+ return;
26
+ }
27
+ const finish = () => {
28
+ clearTimeout(timer);
29
+ signal?.removeEventListener("abort", finish);
30
+ resolve();
31
+ };
32
+ const timer = setTimeout(finish, ms);
33
+ signal?.addEventListener("abort", finish, { once: true });
34
+ });
35
+ }
36
+ export async function fetchWithRetry(input, init, retries = 3, fetchImpl = fetch) {
37
+ for (let i = 0; i < retries; i++) {
38
+ const res = await fetchImpl(input, init);
39
+ if ((res.status === 429 || res.status === 529) && i < retries - 1) {
40
+ const retryAfter = res.headers.get("retry-after");
41
+ const parsed = retryAfter ? parseInt(retryAfter, 10) : NaN;
42
+ const delay = Number.isNaN(parsed) ? (i + 1) * 2000 : parsed * 1000;
43
+ // If delay exceeds the cap, the server is signalling a quota/usage-limit
44
+ // reset far in the future. Return immediately so the error surfaces to
45
+ // the user rather than silently hanging until the reset time.
46
+ if (delay > getMaxRetryDelayMs()) {
47
+ log("fetch_rate_limited_quota", {
48
+ status: res.status,
49
+ retryAfter: retryAfter ?? "none",
50
+ delayMs: delay,
51
+ });
52
+ return res;
53
+ }
54
+ log("fetch_rate_limited", {
55
+ status: res.status,
56
+ attempt: i + 1,
57
+ retryAfter: retryAfter ?? "none",
58
+ delayMs: delay,
59
+ });
60
+ await sleepUnlessAborted(delay, init?.signal);
61
+ if (init?.signal?.aborted) {
62
+ // The caller's deadline passed while we were backing off. Surface the
63
+ // rate-limit response rather than issuing a request that can only fail.
64
+ log("fetch_retry_aborted", { status: res.status });
65
+ return res;
66
+ }
67
+ continue;
68
+ }
69
+ return res;
70
+ }
71
+ // Only reachable when retries < 1; still issue the request once.
72
+ return fetchImpl(input, init);
73
+ }
74
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import type { Plugin } from "@opencode-ai/plugin";
2
2
  export { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.ts";
3
3
  export { resetExcludedBetas } from "./betas.ts";
4
+ export { fetchWithRetry, type FetchFn } from "./http.ts";
4
5
  export { stripToolPrefix, SYSTEM_IDENTITY, transformBody, transformResponseStream, } from "./transforms.ts";
5
6
  export { getCachedCredentials, syncAuthJson, refreshAccountsList, type ClaudeCredentials, } from "./credentials.ts";
6
7
  export { buildBillingHeaderValue, computeCch, computeVersionSuffix, extractFirstUserMessageText, } from "./signing.ts";
7
- type FetchFn = typeof fetch;
8
- export declare function fetchWithRetry(input: RequestInfo | URL, init?: RequestInit, retries?: number, fetchImpl?: FetchFn): Promise<Response>;
9
8
  export declare function buildRequestHeaders(input: RequestInfo | URL, init: RequestInit, accessToken: string, modelId?: string, excludedBetas?: Set<string>): Headers;
10
9
  declare const plugin: Plugin;
11
10
  export declare const ClaudeAuthPlugin: Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAgCjD,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,eAAe,EACf,aAAa,EACb,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAA;AA8CrB,KAAK,OAAO,GAAG,OAAO,KAAK,CAAA;AAiB3B,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,SAAI,EACX,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,QAAQ,CAAC,CA8BnB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,SAAY,EACnB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,OAAO,CAqDT;AAKD,QAAA,MAAM,MAAM,EAAE,MAuWb,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,CAAA;AACtC,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkCjD,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,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EACL,eAAe,EACf,eAAe,EACf,aAAa,EACb,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAA;AA8CrB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,SAAY,EACnB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,OAAO,CAqDT;AAKD,QAAA,MAAM,MAAM,EAAE,MAyfb,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,CAAA;AACtC,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -2,11 +2,13 @@ import crypto from "node:crypto";
2
2
  import { config } from "./model-config.js";
3
3
  import { readAllClaudeAccounts } from "./keychain.js";
4
4
  import { initLogger, log } from "./logger.js";
5
+ import { fetchWithRetry } from "./http.js";
5
6
  import { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
6
7
  import { SYSTEM_IDENTITY, transformBody, transformResponseStream, } from "./transforms.js";
7
- import { getCachedCredentials, reloadCredentialsFromSource, getActiveAccount, syncAuthJson, initAccounts, setActiveAccountSource, loadPersistedAccountSource, saveAccountSource, refreshAccountsList, refreshIfNeeded, } from "./credentials.js";
8
+ import { getCachedCredentials, reloadCredentialsFromSource, forceRefreshActiveAccount, getActiveAccount, syncAuthJson, initAccounts, setActiveAccountSource, loadPersistedAccountSource, saveAccountSource, refreshAccountsList, refreshIfNeeded, } from "./credentials.js";
8
9
  export { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
9
10
  export { resetExcludedBetas } from "./betas.js";
11
+ export { fetchWithRetry } from "./http.js";
10
12
  export { stripToolPrefix, SYSTEM_IDENTITY, transformBody, transformResponseStream, } from "./transforms.js";
11
13
  export { getCachedCredentials, syncAuthJson, refreshAccountsList, } from "./credentials.js";
12
14
  export { buildBillingHeaderValue, computeCch, computeVersionSuffix, extractFirstUserMessageText, } from "./signing.js";
@@ -43,51 +45,6 @@ function buildRequestUrl(input) {
43
45
  }
44
46
  // Stable per-process session ID, matching Claude Code's X-Claude-Code-Session-Id
45
47
  const sessionId = crypto.randomUUID();
46
- // Maximum delay before we give up retrying and surface the error.
47
- // A retry-after longer than this signals a quota/usage-limit reset (hours away)
48
- // rather than a transient rate limit — retrying would hang indefinitely.
49
- // Override with OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS for longer retry windows.
50
- const DEFAULT_MAX_RETRY_DELAY_MS = 30_000;
51
- function getMaxRetryDelayMs() {
52
- const env = process.env.OPENCODE_CLAUDE_AUTH_MAX_RETRY_MS;
53
- if (env) {
54
- const parsed = parseInt(env, 10);
55
- if (!Number.isNaN(parsed) && parsed > 0)
56
- return parsed;
57
- }
58
- return DEFAULT_MAX_RETRY_DELAY_MS;
59
- }
60
- export async function fetchWithRetry(input, init, retries = 3, fetchImpl = fetch) {
61
- for (let i = 0; i < retries; i++) {
62
- const res = await fetchImpl(input, init);
63
- if ((res.status === 429 || res.status === 529) && i < retries - 1) {
64
- const retryAfter = res.headers.get("retry-after");
65
- const parsed = retryAfter ? parseInt(retryAfter, 10) : NaN;
66
- const delay = Number.isNaN(parsed) ? (i + 1) * 2000 : parsed * 1000;
67
- // If delay exceeds the cap, the server is signalling a quota/usage-limit
68
- // reset far in the future. Return immediately so the error surfaces to
69
- // the user rather than silently hanging until the reset time.
70
- if (delay > getMaxRetryDelayMs()) {
71
- log("fetch_rate_limited_quota", {
72
- status: res.status,
73
- retryAfter: retryAfter ?? "none",
74
- delayMs: delay,
75
- });
76
- return res;
77
- }
78
- log("fetch_rate_limited", {
79
- status: res.status,
80
- attempt: i + 1,
81
- retryAfter: retryAfter ?? "none",
82
- delayMs: delay,
83
- });
84
- await new Promise((r) => setTimeout(r, delay));
85
- continue;
86
- }
87
- return res;
88
- }
89
- return fetchImpl(input, init);
90
- }
91
48
  export function buildRequestHeaders(input, init, accessToken, modelId = "unknown", excludedBetas) {
92
49
  const headers = new Headers();
93
50
  if (input instanceof Request) {
@@ -166,7 +123,7 @@ const plugin = async () => {
166
123
  sources: accounts.map((a) => a.source),
167
124
  activeSource: defaultAccount.source,
168
125
  });
169
- const initialCreds = getCachedCredentials();
126
+ const initialCreds = await getCachedCredentials();
170
127
  if (initialCreds) {
171
128
  syncAuthJson(initialCreds);
172
129
  }
@@ -183,7 +140,7 @@ const plugin = async () => {
183
140
  // This prevents the "run `claude` to re-authenticate" message from
184
141
  // appearing mid-session when the token silently expires.
185
142
  let proactiveRefreshWarned = false;
186
- const syncTimer = setInterval(() => {
143
+ const syncTimer = setInterval(async () => {
187
144
  try {
188
145
  const account = getActiveAccount();
189
146
  log("proactive_refresh_check", {
@@ -191,7 +148,7 @@ const plugin = async () => {
191
148
  expiresAt: account?.credentials?.expiresAt ?? null,
192
149
  thresholdMs: PROACTIVE_REFRESH_THRESHOLD_MS,
193
150
  });
194
- const creds = refreshIfNeeded(undefined, PROACTIVE_REFRESH_THRESHOLD_MS);
151
+ const creds = await refreshIfNeeded(undefined, PROACTIVE_REFRESH_THRESHOLD_MS);
195
152
  if (creds) {
196
153
  syncAuthJson(creds);
197
154
  if (proactiveRefreshWarned) {
@@ -255,7 +212,7 @@ const plugin = async () => {
255
212
  apiKey: "",
256
213
  baseURL: "https://api.anthropic.com/v1",
257
214
  async fetch(input, init) {
258
- const latest = getCachedCredentials();
215
+ const latest = await getCachedCredentials();
259
216
  if (!latest) {
260
217
  log("fetch_no_credentials", { modelId: "unknown" });
261
218
  throw new Error("Claude Code credentials are unavailable or expired. Run `claude` to refresh them.");
@@ -300,25 +257,148 @@ const plugin = async () => {
300
257
  modelId,
301
258
  retryAttempt: 0,
302
259
  });
303
- // On 401, bypass the in-memory cache to pick up credentials rotated by
304
- // another client, then retry once only when the access token changed.
305
- let preserveResponseUnchanged = false;
306
- if (response.status === 401) {
307
- let refreshed = null;
260
+ // Recover from a rejected token: first by adopting credentials
261
+ // rotated externally (cswap switching accounts, the claude CLI,
262
+ // another OpenCode instance), then by forcing an OAuth refresh
263
+ // when the store still holds the token that was just rejected.
264
+ //
265
+ // Most cases resolve on the first attempt: a cold or unreadable
266
+ // store yields null from the reload (reloadCredentialsFromSource
267
+ // rejects anything expiring within 60s), so the force refresh runs
268
+ // immediately. The second attempt covers the narrower race where
269
+ // the reload returns a valid-looking token that a concurrent
270
+ // writer has itself just rotated again.
271
+ //
272
+ // The cap is the real bound. Against a store being rotated on
273
+ // every read, every candidate differs from tokenInUse, so the
274
+ // no-progress break never fires and the cap alone stops the loop.
275
+ // The break is the fast path out of the common cases, not the
276
+ // guarantee of termination.
277
+ //
278
+ // tokenInUse deliberately tracks only the last token tried rather
279
+ // than the set of all of them: a store cycling A->B->A wastes one
280
+ // request on the second attempt, which is a better trade than
281
+ // threading extra state through a loop whose whole virtue is a
282
+ // hard ceiling of three API calls.
283
+ const MAX_AUTH_RECOVERY_ATTEMPTS = 2;
284
+ let tokenInUse = latest.accessToken;
285
+ for (let attempt = 0; response.status === 401 && attempt < MAX_AUTH_RECOVERY_ATTEMPTS; attempt++) {
286
+ let candidate = null;
287
+ // reloadCredentialsFromSource already catches its own source
288
+ // read and returns null, so this is unreachable today. It stays
289
+ // because the guarantee worth keeping is that no reload failure
290
+ // turns a well-formed 401 into an exception thrown out of
291
+ // fetch() — degrading to the original response beats crashing
292
+ // the request. It logs so a future reload that does throw is
293
+ // diagnosable rather than silently null-coalesced.
308
294
  try {
309
- refreshed = reloadCredentialsFromSource();
295
+ candidate = reloadCredentialsFromSource();
310
296
  }
311
- catch { }
312
- if (refreshed && refreshed.accessToken !== latest.accessToken) {
313
- const retryHeaders = buildRequestHeaders(input, requestInit, refreshed.accessToken, modelId, excluded);
297
+ catch (err) {
298
+ log("auth_recovery_reload_threw", {
299
+ modelId,
300
+ attempt: attempt + 1,
301
+ error: err instanceof Error ? err.message : String(err),
302
+ });
303
+ }
304
+ if (!candidate || candidate.accessToken === tokenInUse) {
305
+ try {
306
+ candidate = await forceRefreshActiveAccount();
307
+ }
308
+ catch (err) {
309
+ // A rejected refresh and a refresh that returned null are
310
+ // different operator-facing diagnoses; auth_recovery_
311
+ // exhausted below collapses them, so record this one here.
312
+ log("auth_recovery_force_refresh_threw", {
313
+ modelId,
314
+ attempt: attempt + 1,
315
+ error: err instanceof Error ? err.message : String(err),
316
+ });
317
+ }
318
+ }
319
+ // Re-checked, not copy-pasted: the guard above decides whether
320
+ // to force a refresh, this one decides whether that refresh
321
+ // actually produced a token worth retrying with.
322
+ if (!candidate || candidate.accessToken === tokenInUse) {
323
+ log("auth_recovery_exhausted", {
324
+ modelId,
325
+ attempt: attempt + 1,
326
+ });
327
+ break;
328
+ }
329
+ tokenInUse = candidate.accessToken;
330
+ log("auth_recovery_retry", { modelId, attempt: attempt + 1 });
331
+ response = await fetchWithRetry(requestUrl, {
332
+ ...requestInit,
333
+ body,
334
+ headers: buildRequestHeaders(input, requestInit, tokenInUse, modelId, excluded),
335
+ });
336
+ }
337
+ // An external switch — cswap rotating off an exhausted account —
338
+ // leaves this session on the old token until the 30s credential
339
+ // cache expires. Re-read once so a rate limit that has already
340
+ // been resolved elsewhere is not surfaced. A changed token is the
341
+ // signal that a switch happened; when nothing changed this costs
342
+ // one source read and no retry.
343
+ //
344
+ // Ordered AFTER the 401 recovery loop, and that is a real
345
+ // dependency, not incidental sequencing: it must compare against
346
+ // the token the loop last tried, so a 401 recovered into a 429 is
347
+ // measured against the recovered token rather than the rejected
348
+ // one. Only half of this is compiler-enforced — hoisting the block
349
+ // above `let tokenInUse` is a TDZ error, but moving it between
350
+ // that declaration and the loop still compiles and still passes,
351
+ // while silently comparing against a stale token on the
352
+ // 401 -> retry -> 429 path.
353
+ //
354
+ // Ordered before the long-context beta loop deliberately. A
355
+ // long-context 429 is a header problem, not an account one, so it
356
+ // rotates no token and falls through here untouched. In the rare
357
+ // case a switch lands on the same 429, this spends one retry that
358
+ // comes back with the same long-context error and the beta loop
359
+ // then handles it off the fresh response — one wasted request,
360
+ // same outcome.
361
+ if (response.status === 429) {
362
+ let rotated = null;
363
+ // Unreachable today for the same reason as the 401 loop's
364
+ // reload catch: reloadCredentialsFromSource swallows its own
365
+ // source read and returns null. Kept, and logged, on the same
366
+ // grounds — no reload failure should turn a readable 429 into
367
+ // an exception thrown out of fetch(), and a future reload that
368
+ // does throw should be diagnosable rather than silently
369
+ // coalesced to "nothing rotated".
370
+ try {
371
+ rotated = reloadCredentialsFromSource();
372
+ }
373
+ catch (err) {
374
+ log("rate_limit_reload_threw", {
375
+ modelId,
376
+ error: err instanceof Error ? err.message : String(err),
377
+ });
378
+ }
379
+ if (rotated && rotated.accessToken !== tokenInUse) {
380
+ // Named for what was observed, not for what it implies. A
381
+ // changed token is not proof of an account switch: a routine
382
+ // refresh of this same exhausted account by another instance
383
+ // or the claude CLI changes the token too, and that retry hits
384
+ // the same quota. Accepted cost — one request — but the log
385
+ // must not tell a quota investigation "we switched accounts"
386
+ // when all it saw was a different token.
387
+ log("rate_limit_token_changed", { modelId });
388
+ tokenInUse = rotated.accessToken;
314
389
  response = await fetchWithRetry(requestUrl, {
315
390
  ...requestInit,
316
391
  body,
317
- headers: retryHeaders,
392
+ headers: buildRequestHeaders(input, requestInit, tokenInUse, modelId, excluded),
393
+ });
394
+ // Whether rotating resolved the limit is the question this
395
+ // whole block exists to answer, so record it outright rather
396
+ // than leaving success to be inferred from the absence of a
397
+ // fetch_error_response line.
398
+ log("rate_limit_retry_response", {
399
+ modelId,
400
+ status: response.status,
318
401
  });
319
- }
320
- else {
321
- preserveResponseUnchanged = true;
322
402
  }
323
403
  }
324
404
  // Check for long-context beta errors and retry with betas excluded
@@ -342,8 +422,10 @@ const plugin = async () => {
342
422
  excludedBeta: betaToExclude,
343
423
  });
344
424
  // Rebuild headers without the excluded beta and retry
345
- const currentCreds = getCachedCredentials();
346
- const retryToken = currentCreds?.accessToken ?? latest.accessToken;
425
+ // Falls back to tokenInUse, not latest: after a 401 recovery the
426
+ // latter is the token the API already rejected.
427
+ const currentCreds = await getCachedCredentials();
428
+ const retryToken = currentCreds?.accessToken ?? tokenInUse;
347
429
  const newExcluded = getExcludedBetas(modelId);
348
430
  const newHeaders = buildRequestHeaders(input, requestInit, retryToken, modelId, newExcluded);
349
431
  response = await fetchWithRetry(requestUrl, {
@@ -370,7 +452,10 @@ const plugin = async () => {
370
452
  })
371
453
  .catch(() => { });
372
454
  }
373
- return preserveResponseUnchanged
455
+ // A 401 that survived recovery carries an error body, not an SSE
456
+ // stream. Deciding here rather than from a flag set mid-flight
457
+ // makes the retried and non-retried paths behave identically.
458
+ return response.status === 401
374
459
  ? response
375
460
  : transformResponseStream(response);
376
461
  },
@@ -406,7 +491,7 @@ const plugin = async () => {
406
491
  latestAccounts[0] ??
407
492
  accounts[0];
408
493
  setActiveAccountSource(chosen.source);
409
- const creds = getCachedCredentials() ?? chosen.credentials;
494
+ const creds = (await getCachedCredentials()) ?? chosen.credentials;
410
495
  syncAuthJson(creds);
411
496
  saveAccountSource(chosen.source);
412
497
  const sourceDescription = chosen.source === "file"
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,25 @@ export declare function updateCredentialBlob(existingJson: string, newCreds: {
22
22
  refreshToken: string;
23
23
  expiresAt: number;
24
24
  }): string | null;
25
- export declare function writeBackCredentials(source: string, creds: ClaudeCredentials, configDir?: string): boolean;
25
+ /**
26
+ * Whether a stored credential blob still carries the access token we expect.
27
+ *
28
+ * Guards write-back against an external switch landing between the read that
29
+ * produced the token being refreshed and the write of its replacement. An
30
+ * unparseable blob returns false: a write into state we cannot identify is
31
+ * exactly what this is meant to prevent.
32
+ *
33
+ * Deliberately stricter than the write it guards: this validates through
34
+ * parseCredentials (field types, mcpOAuth-only rejection) while
35
+ * updateCredentialBlob rewrites anything JSON.parse accepts. So a blob the
36
+ * write path would happily update can still be refused here. That gap is
37
+ * intentional — reaching this guard means an earlier parseCredentials
38
+ * succeeded, so a blob that no longer parses changed shape after we read it
39
+ * (a truncated non-atomic external write, or a hand edit), and declining to
40
+ * write over it is correct. Anyone tightening parseCredentials should know it
41
+ * narrows write-back too, not just reads.
42
+ */
43
+ export declare function credentialBlobMatches(raw: string, expectedAccessToken: string): boolean;
44
+ export declare function writeBackCredentials(source: string, creds: ClaudeCredentials, configDir?: string, expectedPriorAccessToken?: string): boolean;
26
45
  export declare function refreshAccount(source: string, configDir?: string): ClaudeCredentials | null;
27
46
  //# sourceMappingURL=keychain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAaA,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,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAED,eAAO,MAAM,eAAe,4BAA4B,CAAA;AAExD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmDtE;AAkID,wBAAgB,mBAAmB,CACjC,SAAS,SAA8D,GACtE,iBAAiB,GAAG,IAAI,CAW1B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAwCD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAcD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAC1B,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAC1B,MAAM,EAAE,CA4BV;AAED,wBAAgB,qBAAqB,IAAI,aAAa,EAAE,CAgFvD;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,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAyDT;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB,GAAG,IAAI,CAO1B"}
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAaA,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,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAED,eAAO,MAAM,eAAe,4BAA4B,CAAA;AAExD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmDtE;AAkID,wBAAgB,mBAAmB,CACjC,SAAS,SAA8D,GACtE,iBAAiB,GAAG,IAAI,CAW1B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAwCD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAcD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAC1B,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAC1B,MAAM,EAAE,CA4BV;AAED,wBAAgB,qBAAqB,IAAI,aAAa,EAAE,CAgFvD;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;AAgCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAGT;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,wBAAwB,CAAC,EAAE,MAAM,GAChC,OAAO,CA8FT;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB,GAAG,IAAI,CAO1B"}
package/dist/keychain.js CHANGED
@@ -340,7 +340,37 @@ function getKeychainAccountName(serviceName) {
340
340
  return null;
341
341
  }
342
342
  }
343
- export function writeBackCredentials(source, creds, configDir) {
343
+ /**
344
+ * A short, non-reversible tag for an access token, so write-back decisions
345
+ * can be correlated across log lines (and against another account's) without
346
+ * putting token material in the log.
347
+ */
348
+ function tokenFingerprint(token) {
349
+ return createHash("sha256").update(token).digest("hex").slice(0, 8);
350
+ }
351
+ /**
352
+ * Whether a stored credential blob still carries the access token we expect.
353
+ *
354
+ * Guards write-back against an external switch landing between the read that
355
+ * produced the token being refreshed and the write of its replacement. An
356
+ * unparseable blob returns false: a write into state we cannot identify is
357
+ * exactly what this is meant to prevent.
358
+ *
359
+ * Deliberately stricter than the write it guards: this validates through
360
+ * parseCredentials (field types, mcpOAuth-only rejection) while
361
+ * updateCredentialBlob rewrites anything JSON.parse accepts. So a blob the
362
+ * write path would happily update can still be refused here. That gap is
363
+ * intentional — reaching this guard means an earlier parseCredentials
364
+ * succeeded, so a blob that no longer parses changed shape after we read it
365
+ * (a truncated non-atomic external write, or a hand edit), and declining to
366
+ * write over it is correct. Anyone tightening parseCredentials should know it
367
+ * narrows write-back too, not just reads.
368
+ */
369
+ export function credentialBlobMatches(raw, expectedAccessToken) {
370
+ const parsed = parseCredentials(raw);
371
+ return parsed?.accessToken === expectedAccessToken;
372
+ }
373
+ export function writeBackCredentials(source, creds, configDir, expectedPriorAccessToken) {
344
374
  const newCreds = {
345
375
  accessToken: creds.accessToken,
346
376
  refreshToken: creds.refreshToken,
@@ -351,6 +381,25 @@ export function writeBackCredentials(source, creds, configDir) {
351
381
  const dir = configDir ?? process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude");
352
382
  const credPath = join(dir, ".credentials.json");
353
383
  const raw = readFileSync(credPath, "utf-8");
384
+ if (expectedPriorAccessToken !== undefined &&
385
+ !credentialBlobMatches(raw, expectedPriorAccessToken)) {
386
+ // Two operationally opposite causes: another account legitimately
387
+ // holds the slot (benign, no action) versus a blob we cannot read at
388
+ // all (corruption, needs a human). Same refusal, different events.
389
+ const stored = parseCredentials(raw);
390
+ if (stored === null) {
391
+ log("writeback_skipped_unparseable", { source, configDir: dir });
392
+ }
393
+ else {
394
+ log("writeback_skipped_stale", {
395
+ source,
396
+ configDir: dir,
397
+ expected: tokenFingerprint(expectedPriorAccessToken),
398
+ stored: tokenFingerprint(stored.accessToken),
399
+ });
400
+ }
401
+ return false;
402
+ }
354
403
  const updated = updateCredentialBlob(raw, newCreds);
355
404
  if (!updated)
356
405
  return false;
@@ -371,6 +420,22 @@ export function writeBackCredentials(source, creds, configDir) {
371
420
  const raw = readKeychainService(source);
372
421
  if (!raw)
373
422
  return false;
423
+ if (expectedPriorAccessToken !== undefined &&
424
+ !credentialBlobMatches(raw, expectedPriorAccessToken)) {
425
+ // See the file branch: a mismatch is expected, an unreadable blob is not.
426
+ const stored = parseCredentials(raw);
427
+ if (stored === null) {
428
+ log("writeback_skipped_unparseable", { source });
429
+ }
430
+ else {
431
+ log("writeback_skipped_stale", {
432
+ source,
433
+ expected: tokenFingerprint(expectedPriorAccessToken),
434
+ stored: tokenFingerprint(stored.accessToken),
435
+ });
436
+ }
437
+ return false;
438
+ }
374
439
  const updated = updateCredentialBlob(raw, newCreds);
375
440
  if (!updated)
376
441
  return false;