opencode-claude-auth 2.1.4 → 2.1.6

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.
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Transient-vs-terminal classification and per-account backoff for OAuth token
3
+ * refreshes.
4
+ *
5
+ * The token endpoint (`claude.ai/v1/oauth/token`) rate-limits refresh requests
6
+ * with HTTP 429 `rate_limit_error`. That is transient — the refresh token is
7
+ * still valid — but the plugin previously treated every non-OK refresh as a
8
+ * hard failure, surfacing "credentials unavailable. Run `claude`" and then
9
+ * hammering the same endpoint (and the `claude` CLI, which hits it too). This
10
+ * module lets callers tell a transient rate-limit apart from a genuinely dead
11
+ * refresh token (`invalid_grant`), and imposes a cooldown so a rate-limited
12
+ * account is not re-hit until the window has plausibly cleared.
13
+ */
14
+ export type RefreshFailureKind = "transient" | "terminal";
15
+ /** Base cooldown after the first transient failure (env-overridable). */
16
+ export declare const BASE_COOLDOWN_MS: number;
17
+ /** Hard ceiling for a single cooldown, regardless of consecutive failures. */
18
+ export declare const MAX_COOLDOWN_MS = 60000;
19
+ export declare function classifyRefreshFailure(_status: number, oauthError?: string): RefreshFailureKind;
20
+ interface BackoffOptions {
21
+ retryAfterMs?: number;
22
+ now?: number;
23
+ rng?: () => number;
24
+ }
25
+ /**
26
+ * Delay before the next refresh attempt. An explicit `retry-after` from the
27
+ * endpoint wins (still clamped to `MAX_COOLDOWN_MS`); otherwise an exponential
28
+ * schedule (base · 2^(n-1),
29
+ * capped) with jitter in the [50%, 100%] band to desynchronize the several
30
+ * OpenCode instances / CLI invocations that all refresh the same account.
31
+ */
32
+ export declare function computeBackoffMs(consecutive: number, opts?: BackoffOptions): number;
33
+ /**
34
+ * Record a transient refresh failure for `source` and return the cooldown
35
+ * duration applied. The cooldown escalates with consecutive transient
36
+ * failures and is exposed via {@link isRefreshCooldownActive}.
37
+ */
38
+ export declare function noteRefreshTransient(source: string, opts?: BackoffOptions): number;
39
+ /** Record a terminal refresh failure (dead refresh token). No cooldown. */
40
+ export declare function noteRefreshTerminal(source: string): void;
41
+ /** Clear all backoff state for `source` after a successful refresh/adopt. */
42
+ export declare function clearRefreshOutcome(source: string): void;
43
+ export declare function isRefreshCooldownActive(source: string, now?: number): boolean;
44
+ export declare function getRefreshCooldownUntil(source: string): number | null;
45
+ export declare function getRefreshFailureKind(source: string): RefreshFailureKind | null;
46
+ /** Test seam: drop all in-memory backoff state. */
47
+ export declare function resetRefreshBackoffState(): void;
48
+ export {};
49
+ //# sourceMappingURL=refresh-backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-backoff.d.ts","sourceRoot":"","sources":["../src/refresh-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,UAAU,CAAA;AAEzD,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,QAIzB,CAAA;AAEJ,8EAA8E;AAC9E,eAAO,MAAM,eAAe,QAAS,CAAA;AAerC,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,kBAAkB,CAIpB;AAED,UAAU,cAAc;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,cAAmB,GACxB,MAAM,CAYR;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,cAAmB,GACxB,MAAM,CAOR;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAmB,GACvB,OAAO,CAGT;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GACb,kBAAkB,GAAG,IAAI,CAE3B;AAED,mDAAmD;AACnD,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Transient-vs-terminal classification and per-account backoff for OAuth token
3
+ * refreshes.
4
+ *
5
+ * The token endpoint (`claude.ai/v1/oauth/token`) rate-limits refresh requests
6
+ * with HTTP 429 `rate_limit_error`. That is transient — the refresh token is
7
+ * still valid — but the plugin previously treated every non-OK refresh as a
8
+ * hard failure, surfacing "credentials unavailable. Run `claude`" and then
9
+ * hammering the same endpoint (and the `claude` CLI, which hits it too). This
10
+ * module lets callers tell a transient rate-limit apart from a genuinely dead
11
+ * refresh token (`invalid_grant`), and imposes a cooldown so a rate-limited
12
+ * account is not re-hit until the window has plausibly cleared.
13
+ */
14
+ /** Base cooldown after the first transient failure (env-overridable). */
15
+ export const BASE_COOLDOWN_MS = (() => {
16
+ const raw = process.env.OPENCODE_CLAUDE_AUTH_REFRESH_COOLDOWN_MS;
17
+ const parsed = raw ? Number.parseInt(raw, 10) : NaN;
18
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 15_000;
19
+ })();
20
+ /** Hard ceiling for a single cooldown, regardless of consecutive failures. */
21
+ export const MAX_COOLDOWN_MS = 60_000;
22
+ /**
23
+ * OAuth token-endpoint error codes that mean the refresh token itself is no
24
+ * longer usable. Everything else — rate limits, 5xx, network errors, unknown
25
+ * codes — is treated as transient so a recoverable blip never surfaces as a
26
+ * hard "re-authenticate" error.
27
+ */
28
+ const TERMINAL_OAUTH_ERRORS = new Set([
29
+ "invalid_grant",
30
+ "invalid_client",
31
+ "unauthorized_client",
32
+ "unsupported_grant_type",
33
+ ]);
34
+ export function classifyRefreshFailure(_status, oauthError) {
35
+ return oauthError && TERMINAL_OAUTH_ERRORS.has(oauthError)
36
+ ? "terminal"
37
+ : "transient";
38
+ }
39
+ /**
40
+ * Delay before the next refresh attempt. An explicit `retry-after` from the
41
+ * endpoint wins (still clamped to `MAX_COOLDOWN_MS`); otherwise an exponential
42
+ * schedule (base · 2^(n-1),
43
+ * capped) with jitter in the [50%, 100%] band to desynchronize the several
44
+ * OpenCode instances / CLI invocations that all refresh the same account.
45
+ */
46
+ export function computeBackoffMs(consecutive, opts = {}) {
47
+ if (opts.retryAfterMs !== undefined && opts.retryAfterMs > 0) {
48
+ // Honor the server's hint, but keep it under the documented cap so a large
49
+ // `Retry-After` (e.g. an hour-long quota reset) can't pin every request to
50
+ // the full wait budget for that whole window.
51
+ return Math.min(MAX_COOLDOWN_MS, opts.retryAfterMs);
52
+ }
53
+ const rng = opts.rng ?? Math.random;
54
+ const exponent = Math.max(0, consecutive - 1);
55
+ const scheduled = Math.min(MAX_COOLDOWN_MS, BASE_COOLDOWN_MS * 2 ** exponent);
56
+ const jitterFactor = 0.5 + rng() * 0.5;
57
+ return Math.min(MAX_COOLDOWN_MS, Math.round(scheduled * jitterFactor));
58
+ }
59
+ const cooldowns = new Map();
60
+ const lastFailureKind = new Map();
61
+ /**
62
+ * Record a transient refresh failure for `source` and return the cooldown
63
+ * duration applied. The cooldown escalates with consecutive transient
64
+ * failures and is exposed via {@link isRefreshCooldownActive}.
65
+ */
66
+ export function noteRefreshTransient(source, opts = {}) {
67
+ const now = opts.now ?? Date.now();
68
+ const consecutive = (cooldowns.get(source)?.consecutive ?? 0) + 1;
69
+ const ms = computeBackoffMs(consecutive, opts);
70
+ cooldowns.set(source, { until: now + ms, consecutive });
71
+ lastFailureKind.set(source, "transient");
72
+ return ms;
73
+ }
74
+ /** Record a terminal refresh failure (dead refresh token). No cooldown. */
75
+ export function noteRefreshTerminal(source) {
76
+ cooldowns.delete(source);
77
+ lastFailureKind.set(source, "terminal");
78
+ }
79
+ /** Clear all backoff state for `source` after a successful refresh/adopt. */
80
+ export function clearRefreshOutcome(source) {
81
+ cooldowns.delete(source);
82
+ lastFailureKind.delete(source);
83
+ }
84
+ export function isRefreshCooldownActive(source, now = Date.now()) {
85
+ const state = cooldowns.get(source);
86
+ return state !== undefined && state.until > now;
87
+ }
88
+ export function getRefreshCooldownUntil(source) {
89
+ return cooldowns.get(source)?.until ?? null;
90
+ }
91
+ export function getRefreshFailureKind(source) {
92
+ return lastFailureKind.get(source) ?? null;
93
+ }
94
+ /** Test seam: drop all in-memory backoff state. */
95
+ export function resetRefreshBackoffState() {
96
+ cooldowns.clear();
97
+ lastFailureKind.clear();
98
+ }
99
+ //# sourceMappingURL=refresh-backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-backoff.js","sourceRoot":"","sources":["../src/refresh-backoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** How long before a held lock is considered stale (env-overridable). */
2
+ export declare const DEFAULT_LOCK_TTL_MS: number;
3
+ export interface RefreshLock {
4
+ release(): void;
5
+ }
6
+ export interface AcquireOptions {
7
+ /** Directory to hold lock files in. Defaults to the OpenCode data dir. */
8
+ dir?: string;
9
+ /** Staleness threshold in ms. Defaults to {@link DEFAULT_LOCK_TTL_MS}. */
10
+ ttlMs?: number;
11
+ now?: () => number;
12
+ }
13
+ /**
14
+ * Try to acquire the refresh lock for `source`.
15
+ *
16
+ * Returns a {@link RefreshLock} when this process may refresh (either it won the
17
+ * lock, or a filesystem error made the lock unavailable and we degrade to
18
+ * best-effort). Returns null when a live holder currently owns it — the caller
19
+ * should wait and adopt the holder's result instead of refreshing.
20
+ */
21
+ export declare function acquireRefreshLock(source: string, opts?: AcquireOptions): RefreshLock | null;
22
+ //# sourceMappingURL=refresh-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-lock.d.ts","sourceRoot":"","sources":["../src/refresh-lock.ts"],"names":[],"mappings":"AA4BA,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,QAI5B,CAAA;AAEJ,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAkBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,cAAmB,GACxB,WAAW,GAAG,IAAI,CAmEpB"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Best-effort cross-process single-flight lock for OAuth token refreshes.
3
+ *
4
+ * The plugin runs inside every OpenCode process, so several instances (plus the
5
+ * `claude` CLI) can all decide to refresh the same expired token at once and
6
+ * bury the endpoint in duplicate requests — the token endpoint answers the pile
7
+ * with HTTP 429. An advisory lock file lets exactly one refresher proceed; the
8
+ * others wait briefly and adopt the winner's freshly written token from the
9
+ * shared credential store.
10
+ *
11
+ * "Best-effort" is deliberate: any filesystem error degrades to running the
12
+ * refresh without a lock rather than blocking it. A crashed holder cannot
13
+ * wedge the system either — the lock carries a TTL and a stale one is taken
14
+ * over.
15
+ */
16
+ import { closeSync, mkdirSync, openSync, statSync, unlinkSync, writeSync, } from "node:fs";
17
+ import { homedir } from "node:os";
18
+ import { join } from "node:path";
19
+ import { createHash } from "node:crypto";
20
+ import { log } from "./logger.js";
21
+ /** How long before a held lock is considered stale (env-overridable). */
22
+ export const DEFAULT_LOCK_TTL_MS = (() => {
23
+ const raw = process.env.OPENCODE_CLAUDE_AUTH_REFRESH_LOCK_TTL_MS;
24
+ const parsed = raw ? Number.parseInt(raw, 10) : NaN;
25
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 20_000;
26
+ })();
27
+ function defaultLockDir() {
28
+ // Read at call time so tests (and unusual deployments) can redirect the lock
29
+ // directory without reloading the module.
30
+ return (process.env.OPENCODE_CLAUDE_AUTH_REFRESH_LOCK_DIR ??
31
+ join(homedir(), ".local", "share", "opencode"));
32
+ }
33
+ function lockPathFor(source, dir) {
34
+ const digest = createHash("sha256").update(source).digest("hex").slice(0, 16);
35
+ return join(dir, `claude-auth-refresh-${digest}.lock`);
36
+ }
37
+ const NOOP_LOCK = { release() { } };
38
+ /**
39
+ * Try to acquire the refresh lock for `source`.
40
+ *
41
+ * Returns a {@link RefreshLock} when this process may refresh (either it won the
42
+ * lock, or a filesystem error made the lock unavailable and we degrade to
43
+ * best-effort). Returns null when a live holder currently owns it — the caller
44
+ * should wait and adopt the holder's result instead of refreshing.
45
+ */
46
+ export function acquireRefreshLock(source, opts = {}) {
47
+ const dir = opts.dir ?? defaultLockDir();
48
+ const ttlMs = opts.ttlMs ?? DEFAULT_LOCK_TTL_MS;
49
+ const now = opts.now ?? Date.now;
50
+ const path = lockPathFor(source, dir);
51
+ try {
52
+ mkdirSync(dir, { recursive: true });
53
+ }
54
+ catch {
55
+ // Non-fatal: openSync below will surface a real problem.
56
+ }
57
+ // Two attempts: the second only runs after clearing a stale lock.
58
+ for (let attempt = 0; attempt < 2; attempt++) {
59
+ let fd;
60
+ try {
61
+ fd = openSync(path, "wx");
62
+ }
63
+ catch (err) {
64
+ const code = err.code;
65
+ if (code !== "EEXIST") {
66
+ // Unexpected FS failure — never let the lock block a refresh.
67
+ log("refresh_lock_error", { source, error: String(code ?? err) });
68
+ return NOOP_LOCK;
69
+ }
70
+ // Someone holds it. Take over only if it is stale.
71
+ let stale = false;
72
+ try {
73
+ stale = now() - statSync(path).mtimeMs > ttlMs;
74
+ }
75
+ catch {
76
+ // Vanished between open and stat — retry the acquire.
77
+ stale = true;
78
+ }
79
+ if (stale) {
80
+ log("refresh_lock_stale_takeover", { source });
81
+ try {
82
+ unlinkSync(path);
83
+ }
84
+ catch {
85
+ // Lost the race to remove it; the next attempt/stat settles it.
86
+ }
87
+ continue;
88
+ }
89
+ return null;
90
+ }
91
+ try {
92
+ writeSync(fd, JSON.stringify({ pid: process.pid, ts: now() }));
93
+ }
94
+ catch {
95
+ // The lock is held regardless of whether the payload wrote.
96
+ }
97
+ log("refresh_lock_acquired", { source });
98
+ return {
99
+ release() {
100
+ try {
101
+ closeSync(fd);
102
+ }
103
+ catch {
104
+ // already closed
105
+ }
106
+ try {
107
+ unlinkSync(path);
108
+ }
109
+ catch {
110
+ // already gone (e.g. a stale-takeover removed it)
111
+ }
112
+ },
113
+ };
114
+ }
115
+ return null;
116
+ }
117
+ //# sourceMappingURL=refresh-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-lock.js","sourceRoot":"","sources":["../src/refresh-lock.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,48 @@ type Message = {
7
7
  role?: string;
8
8
  content?: string | ContentBlock[];
9
9
  };
10
+ /**
11
+ * Strategy for reconciling `tool_use` / `tool_result` adjacency that OpenCode's
12
+ * automatic compaction can break (issues #212/#226/#261):
13
+ *
14
+ * - `placeholder` (default): never delete blocks. For any `tool_use` left
15
+ * without an adjacent `tool_result`, synthesize a paired placeholder result.
16
+ * Because assistant `content[]` is never rewritten, `thinking` /
17
+ * `redacted_thinking` blocks stay byte-identical, sidestepping Anthropic's
18
+ * thinking-preservation contract (issue #261).
19
+ * - `drop`: remove orphaned blocks (the upstream behavior), but omit an entire
20
+ * assistant turn when it carries `thinking` blocks and an orphaned `tool_use`
21
+ * rather than partially rewriting it (which #261 forbids).
22
+ */
23
+ export type ToolRepairMode = "placeholder" | "drop";
24
+ /** Content used for a synthesized `tool_result` whose real output was compacted away. */
25
+ export declare const TOOL_RESULT_PLACEHOLDER = "Tool result unavailable (removed during context compaction).";
26
+ /**
27
+ * Resolve the repair strategy from the environment. Defaults to `placeholder`,
28
+ * the lossless strategy. Set `OPENCODE_CLAUDE_AUTH_TOOL_REPAIR=drop` to opt into
29
+ * the drop strategy.
30
+ */
31
+ export declare function resolveToolRepairMode(env?: Record<string, string | undefined>): ToolRepairMode;
32
+ /**
33
+ * Drop-strategy repair. Iterated to a fixed point so that cascades — e.g. an
34
+ * omitted thinking turn orphaning the result that followed it — are fully
35
+ * reconciled rather than left half-repaired.
36
+ */
10
37
  export declare function repairToolPairs(messages: Message[]): Message[];
11
- export declare function transformBody(body: BodyInit | null | undefined): BodyInit | null | undefined;
38
+ /**
39
+ * Placeholder-strategy repair (default). Guarantees `tool_use` ↔ `tool_result`
40
+ * adjacency without ever deleting a block from an assistant turn, so thinking
41
+ * blocks are preserved exactly. Two passes:
42
+ *
43
+ * 1. Remove `tool_result` blocks that have no adjacent preceding `tool_use`
44
+ * (these live in user turns, so no thinking block is affected).
45
+ * 2. Synthesize a placeholder `tool_result`, adjacent, for every `tool_use`
46
+ * that still lacks one.
47
+ */
48
+ export declare function synthesizeMissingToolResults(messages: Message[]): Message[];
49
+ /** Dispatch to the configured repair strategy. */
50
+ export declare function applyToolRepair(messages: Message[], mode: ToolRepairMode): Message[];
51
+ export declare function transformBody(body: BodyInit | null | undefined, mode?: ToolRepairMode): BodyInit | null | undefined;
12
52
  export declare function stripToolPrefix(text: string): string;
13
53
  export declare function transformResponseStream(response: Response): Response;
14
54
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,eAAe,8DACiC,CAAA;AAG7D,KAAK,YAAY,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9E,KAAK,OAAO,GAAG;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAA;CAClC,CAAA;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA0D9D;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAChC,QAAQ,GAAG,IAAI,GAAG,SAAS,CA2K7B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAqEpE"}
1
+ {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,eAAe,8DACiC,CAAA;AAG7D,KAAK,YAAY,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9E,KAAK,OAAO,GAAG;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAA;CAClC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,MAAM,CAAA;AAEnD,yFAAyF;AACzF,eAAO,MAAM,uBAAuB,iEAC4B,CAAA;AAEhE;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,cAAc,CAGhB;AA8ID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAa9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAsF3E;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,EAAE,CAIX;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,IAAI,GAAE,cAAwC,GAC7C,QAAQ,GAAG,IAAI,GAAG,SAAS,CA2K7B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAqEpE"}