@paraharness/claude 0.2.0 → 0.2.1

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.
@@ -3,6 +3,23 @@ import type { ClaudeHttpTransport } from './claude-http-transport.js';
3
3
  export declare const ANTHROPIC_MESSAGES_ENDPOINT = "https://api.anthropic.com/v1/messages";
4
4
  /** Default Anthropic API version header value. */
5
5
  export declare const ANTHROPIC_API_VERSION = "2023-06-01";
6
+ /** Required `anthropic-beta` header value for Claude Code OAuth bearer authentication (`'oauth-2025-04-20'`). */
7
+ export declare const ANTHROPIC_OAUTH_BETA_HEADER = "oauth-2025-04-20";
8
+ /** Token prefix identifying an Anthropic OAuth access token (`'sk-ant-oat'`). */
9
+ export declare const CLAUDE_OAUTH_TOKEN_PREFIX = "sk-ant-oat";
10
+ /** Default Claude Code configuration directory name under the user's home directory (`'.claude'`). */
11
+ export declare const CLAUDE_DEFAULT_CONFIG_SUBDIR = ".claude";
12
+ /** Base macOS Keychain service name storing Claude Code OAuth credentials (`'Claude Code-credentials'`). */
13
+ export declare const CLAUDE_KEYCHAIN_BASE_SERVICE_NAME = "Claude Code-credentials";
14
+ /** Prefix length of the SHA-256 hex digest appended to custom `configDir` Keychain service names. */
15
+ export declare const CLAUDE_KEYCHAIN_HASH_PREFIX_LENGTH = 8;
16
+ /** Divisor converting raw token counts to thousands of tokens (`1_000`). */
17
+ export declare const TOKENS_PER_THOUSAND = 1000;
18
+ /** USD pricing per `1,000` input and output tokens keyed by Claude model family (`'opus' | 'sonnet' | 'haiku'`). */
19
+ export declare const CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS: Readonly<Record<'opus' | 'sonnet' | 'haiku', Readonly<{
20
+ readonly inputUsd: number;
21
+ readonly outputUsd: number;
22
+ }>>>;
6
23
  /** Default `max_tokens` ceiling sent on Anthropic `/v1/messages` requests. */
7
24
  export declare const DEFAULT_CLAUDE_MAX_TOKENS = 16384;
8
25
  /** Extended thinking token budgets keyed by reasoning effort level (`'low' | 'medium' | 'high'`). */
@@ -1 +1 @@
1
- {"version":3,"file":"default-claude-http-transport.constants.d.ts","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,yDAAyD;AACzD,eAAO,MAAM,2BAA2B,0CAA0C,CAAC;AAEnF,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,qGAAqG;AACrG,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,CAKpF,CAAC;AAEL,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKvD,CAAC;AAEH,qGAAqG;AACrG,eAAO,MAAM,0BAA0B,EAAE,mBAevC,CAAC"}
1
+ {"version":3,"file":"default-claude-http-transport.constants.d.ts","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,yDAAyD;AACzD,eAAO,MAAM,2BAA2B,0CAA0C,CAAC;AAEnF,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,iHAAiH;AACjH,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,eAAe,CAAC;AAEtD,sGAAsG;AACtG,eAAO,MAAM,4BAA4B,YAAY,CAAC;AAEtD,4GAA4G;AAC5G,eAAO,MAAM,iCAAiC,4BAA4B,CAAC;AAE3E,qGAAqG;AACrG,eAAO,MAAM,kCAAkC,IAAI,CAAC;AAEpD,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC,oHAAoH;AACpH,eAAO,MAAM,wCAAwC,EAAE,QAAQ,CAC7D,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAKxG,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,qGAAqG;AACrG,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,CAKpF,CAAC;AAEL,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKvD,CAAC;AAEH,qGAAqG;AACrG,eAAO,MAAM,0BAA0B,EAAE,mBAevC,CAAC"}
@@ -3,6 +3,24 @@ import { sendClaudeMessagesViaSdk } from './internal/send-claude-messages-via-sd
3
3
  export const ANTHROPIC_MESSAGES_ENDPOINT = 'https://api.anthropic.com/v1/messages';
4
4
  /** Default Anthropic API version header value. */
5
5
  export const ANTHROPIC_API_VERSION = '2023-06-01';
6
+ /** Required `anthropic-beta` header value for Claude Code OAuth bearer authentication (`'oauth-2025-04-20'`). */
7
+ export const ANTHROPIC_OAUTH_BETA_HEADER = 'oauth-2025-04-20';
8
+ /** Token prefix identifying an Anthropic OAuth access token (`'sk-ant-oat'`). */
9
+ export const CLAUDE_OAUTH_TOKEN_PREFIX = 'sk-ant-oat';
10
+ /** Default Claude Code configuration directory name under the user's home directory (`'.claude'`). */
11
+ export const CLAUDE_DEFAULT_CONFIG_SUBDIR = '.claude';
12
+ /** Base macOS Keychain service name storing Claude Code OAuth credentials (`'Claude Code-credentials'`). */
13
+ export const CLAUDE_KEYCHAIN_BASE_SERVICE_NAME = 'Claude Code-credentials';
14
+ /** Prefix length of the SHA-256 hex digest appended to custom `configDir` Keychain service names. */
15
+ export const CLAUDE_KEYCHAIN_HASH_PREFIX_LENGTH = 8;
16
+ /** Divisor converting raw token counts to thousands of tokens (`1_000`). */
17
+ export const TOKENS_PER_THOUSAND = 1_000;
18
+ /** USD pricing per `1,000` input and output tokens keyed by Claude model family (`'opus' | 'sonnet' | 'haiku'`). */
19
+ export const CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS = Object.freeze({
20
+ opus: Object.freeze({ inputUsd: 0.015, outputUsd: 0.075 }),
21
+ sonnet: Object.freeze({ inputUsd: 0.003, outputUsd: 0.015 }),
22
+ haiku: Object.freeze({ inputUsd: 0.001, outputUsd: 0.005 }),
23
+ });
6
24
  /** Default `max_tokens` ceiling sent on Anthropic `/v1/messages` requests. */
7
25
  export const DEFAULT_CLAUDE_MAX_TOKENS = 16_384;
8
26
  /** Extended thinking token budgets keyed by reasoning effort level (`'low' | 'medium' | 'high'`). */
@@ -1 +1 @@
1
- {"version":3,"file":"default-claude-http-transport.constants.js","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEtF,yDAAyD;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,uCAAuC,CAAC;AAEnF,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,qGAAqG;AACrG,MAAM,CAAC,MAAM,uBAAuB,GAClC,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,MAAM;CACb,CAAC,CAAC;AAEL,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC1E,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,WAAW;CACZ,CAAC,CAAC;AAEH,qGAAqG;AACrG,MAAM,CAAC,MAAM,0BAA0B,GAAwB,MAAM,CAAC,MAAM,CAAsB;IAChG;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,OAA0B;QAC5C,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"default-claude-http-transport.constants.js","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEtF,yDAAyD;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,uCAAuC,CAAC;AAEnF,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,iHAAiH;AACjH,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAAkB,CAAC;AAE9D,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AAEtD,sGAAsG;AACtG,MAAM,CAAC,MAAM,4BAA4B,GAAG,SAAS,CAAC;AAEtD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,iCAAiC,GAAG,yBAAyB,CAAC;AAE3E,qGAAqG;AACrG,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC,oHAAoH;AACpH,MAAM,CAAC,MAAM,wCAAwC,GAEjD,MAAM,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;CAC5D,CAAC,CAAC;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,qGAAqG;AACrG,MAAM,CAAC,MAAM,uBAAuB,GAClC,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,MAAM;CACb,CAAC,CAAC;AAEL,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC1E,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,WAAW;CACZ,CAAC,CAAC;AAEH,qGAAqG;AACrG,MAAM,CAAC,MAAM,0BAA0B,GAAwB,MAAM,CAAC,MAAM,CAAsB;IAChG;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,OAA0B;QAC5C,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC,CAAC"}
@@ -77,7 +77,7 @@ export function parseAnthropicMessagesResponse(responseBody, req) {
77
77
  wireFrame,
78
78
  canonical,
79
79
  structuredOutput,
80
- usage: computeAnthropicTurnUsage(responseBody),
80
+ usage: computeAnthropicTurnUsage(responseBody, req.modelId),
81
81
  });
82
82
  }
83
83
  //# sourceMappingURL=claude-wire-converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-wire-converter.js","sourceRoot":"","sources":["../../../src/driver/internal/claude-wire-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-wire-converter.js","sourceRoot":"","sources":["../../../src/driver/internal/claude-wire-converter.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,13 @@ import type { ModelTurnResponse } from '@paraharness/core';
2
2
  /**
3
3
  * Extracts token usage and USD cost metrics from an Anthropic `/v1/messages` response payload.
4
4
  *
5
- * Reads `input_tokens`, `cache_read_input_tokens`, `output_tokens`, and `cost_usd` from `responseBody.usage`.
5
+ * Reads `input_tokens`, `cache_read_input_tokens`, `output_tokens`, and `cost_usd` from `responseBody.usage`,
6
+ * computing model-aware fallback `costUsd` from `modelId` (`opus`, `sonnet`, or `haiku`) when `cost_usd` is absent.
6
7
  *
7
8
  * @param {Readonly<Record<string, unknown>>} responseBody - Parsed JSON object returned by `/v1/messages`.
9
+ * @param {string | undefined} [modelId] - Optional requested model identifier for rate selection.
8
10
  *
9
11
  * @returns {ModelTurnResponse['usage']} Frozen token usage and cost summary.
10
12
  */
11
- export declare function computeAnthropicTurnUsage(responseBody: Readonly<Record<string, unknown>>): ModelTurnResponse['usage'];
13
+ export declare function computeAnthropicTurnUsage(responseBody: Readonly<Record<string, unknown>>, modelId?: string): ModelTurnResponse['usage'];
12
14
  //# sourceMappingURL=compute-anthropic-turn-usage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute-anthropic-turn-usage.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/compute-anthropic-turn-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9C,iBAAiB,CAAC,OAAO,CAAC,CAmB5B"}
1
+ {"version":3,"file":"compute-anthropic-turn-usage.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/compute-anthropic-turn-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA6B3D;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC/C,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,CAAC,OAAO,CAAC,CAsB5B"}
@@ -1,22 +1,47 @@
1
+ import { CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS, TOKENS_PER_THOUSAND, } from '../default-claude-http-transport.constants.js';
2
+ /**
3
+ * Resolves the per-1k-token USD pricing entry for a Claude model identifier.
4
+ *
5
+ * Matches `'opus'` (`$15/$75` per MTok) and `'haiku'` (`$1/$5` per MTok) substrings case-insensitively,
6
+ * defaulting to `'sonnet'` (`$3/$15` per MTok).
7
+ *
8
+ * @param {string | undefined} modelId - Active Claude model identifier.
9
+ *
10
+ * @returns {Readonly<{ readonly inputUsd: number; readonly outputUsd: number }>} USD rates per `1,000` input and output tokens.
11
+ */
12
+ function resolveClaudeModelPricing(modelId) {
13
+ const normalized = modelId?.toLowerCase() ?? '';
14
+ if (normalized.includes('opus')) {
15
+ return CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS.opus;
16
+ }
17
+ if (normalized.includes('haiku')) {
18
+ return CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS.haiku;
19
+ }
20
+ return CLAUDE_MODEL_PRICING_PER_THOUSAND_TOKENS.sonnet;
21
+ }
1
22
  /**
2
23
  * Extracts token usage and USD cost metrics from an Anthropic `/v1/messages` response payload.
3
24
  *
4
- * Reads `input_tokens`, `cache_read_input_tokens`, `output_tokens`, and `cost_usd` from `responseBody.usage`.
25
+ * Reads `input_tokens`, `cache_read_input_tokens`, `output_tokens`, and `cost_usd` from `responseBody.usage`,
26
+ * computing model-aware fallback `costUsd` from `modelId` (`opus`, `sonnet`, or `haiku`) when `cost_usd` is absent.
5
27
  *
6
28
  * @param {Readonly<Record<string, unknown>>} responseBody - Parsed JSON object returned by `/v1/messages`.
29
+ * @param {string | undefined} [modelId] - Optional requested model identifier for rate selection.
7
30
  *
8
31
  * @returns {ModelTurnResponse['usage']} Frozen token usage and cost summary.
9
32
  */
10
- export function computeAnthropicTurnUsage(responseBody) {
33
+ export function computeAnthropicTurnUsage(responseBody, modelId) {
11
34
  const usageRaw = (responseBody['usage'] ?? {});
12
35
  const inputTokens = typeof usageRaw['input_tokens'] === 'number' ? usageRaw['input_tokens'] : 0;
13
36
  const cachedInputTokens = typeof usageRaw['cache_read_input_tokens'] === 'number'
14
37
  ? usageRaw['cache_read_input_tokens']
15
38
  : 0;
16
39
  const outputTokens = typeof usageRaw['output_tokens'] === 'number' ? usageRaw['output_tokens'] : 0;
40
+ const effectiveModelId = modelId ?? (typeof responseBody['model'] === 'string' ? responseBody['model'] : undefined);
41
+ const pricing = resolveClaudeModelPricing(effectiveModelId);
17
42
  const costUsd = typeof usageRaw['cost_usd'] === 'number'
18
43
  ? usageRaw['cost_usd']
19
- : (inputTokens * 0.003 + outputTokens * 0.015) / 1_000;
44
+ : (inputTokens * pricing.inputUsd + outputTokens * pricing.outputUsd) / TOKENS_PER_THOUSAND;
20
45
  return Object.freeze({
21
46
  inputTokens,
22
47
  cachedInputTokens,
@@ -1 +1 @@
1
- {"version":3,"file":"compute-anthropic-turn-usage.js","sourceRoot":"","sources":["../../../src/driver/internal/compute-anthropic-turn-usage.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAA+C;IAE/C,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAsC,CAAC;IACpF,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,iBAAiB,GACrB,OAAO,QAAQ,CAAC,yBAAyB,CAAC,KAAK,QAAQ;QACrD,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,YAAY,GAChB,OAAO,QAAQ,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GACX,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,QAAQ;QACtC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW;QACX,iBAAiB;QACjB,YAAY;QACZ,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"compute-anthropic-turn-usage.js","sourceRoot":"","sources":["../../../src/driver/internal/compute-anthropic-turn-usage.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wCAAwC,EACxC,mBAAmB,GACpB,MAAM,+CAA+C,CAAC;AAEvD;;;;;;;;;GASG;AACH,SAAS,yBAAyB,CAChC,OAA2B;IAE3B,MAAM,UAAU,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,wCAAwC,CAAC,IAAI,CAAC;IACvD,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,wCAAwC,CAAC,KAAK,CAAC;IACxD,CAAC;IACD,OAAO,wCAAwC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAA+C,EAC/C,OAAgB;IAEhB,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAsC,CAAC;IACpF,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,iBAAiB,GACrB,OAAO,QAAQ,CAAC,yBAAyB,CAAC,KAAK,QAAQ;QACrD,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACrC,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,YAAY,GAChB,OAAO,QAAQ,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,gBAAgB,GACpB,OAAO,IAAI,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,MAAM,OAAO,GACX,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,QAAQ;QACtC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC;IAChG,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW;QACX,iBAAiB;QACjB,YAAY;QACZ,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -1,12 +1,27 @@
1
1
  /**
2
- * Extracts an OAuth bearer token string from a Claude CLI `configDir` path on disk when present.
2
+ * Optional configuration for `extractOAuthTokenFromConfigDir()`.
3
3
  *
4
- * Searches standard credential JSON files inside `configDir` (or `configDir` directly if it is a file)
5
- * and reads `claudeAiOauth.accessToken`, `accessToken`, `access_token`, `oauthToken`, or `token`.
4
+ * Allows unit tests to override the target platform, bypass disk lookups, or inject a deterministic
5
+ * macOS Keychain reader function.
6
+ */
7
+ export interface ExtractOAuthTokenOptions {
8
+ /** Target OS platform override (defaults to `process.platform`). */
9
+ readonly platform?: NodeJS.Platform;
10
+ /** When `true`, skips reading credential files on disk before checking macOS Keychain. */
11
+ readonly skipDiskLookup?: boolean;
12
+ /** Optional custom reader invoked to look up a macOS Keychain service secret by name. */
13
+ readonly readKeychainService?: (serviceName: string) => string | undefined;
14
+ }
15
+ /**
16
+ * Extracts an OAuth bearer token string from a Claude CLI `configDir` path on disk or macOS Keychain.
17
+ *
18
+ * Searches standard credential JSON files inside `configDir` first, and on macOS (`darwin`) falls back
19
+ * to querying the `"Claude Code-credentials"` Keychain entries when no disk credential file is present.
6
20
  *
7
- * @param {string} configDir - Filesystem path to the Claude CLI configuration directory.
21
+ * @param {string} configDir - Filesystem path to the Claude CLI configuration directory.
22
+ * @param {ExtractOAuthTokenOptions | undefined} [options] - Optional platform and Keychain reader overrides.
8
23
  *
9
- * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no credential file exists.
24
+ * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no credential is available.
10
25
  */
11
- export declare function extractOAuthTokenFromConfigDir(configDir: string): string | undefined;
26
+ export declare function extractOAuthTokenFromConfigDir(configDir: string, options?: ExtractOAuthTokenOptions): string | undefined;
12
27
  //# sourceMappingURL=extract-oauth-token-from-config-dir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extract-oauth-token-from-config-dir.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/extract-oauth-token-from-config-dir.ts"],"names":[],"mappings":"AAuEA;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBpF"}
1
+ {"version":3,"file":"extract-oauth-token-from-config-dir.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/extract-oauth-token-from-config-dir.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5E;AAoLD;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,wBAAwB,GACjC,MAAM,GAAG,SAAS,CAyBpB"}
@@ -1,17 +1,22 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
1
3
  import { existsSync, readFileSync, statSync } from 'node:fs';
2
4
  import { homedir } from 'node:os';
3
5
  import { join } from 'node:path';
4
- import { CLAUDE_CREDENTIAL_FILENAMES } from '../default-claude-http-transport.constants.js';
6
+ import { CLAUDE_CREDENTIAL_FILENAMES, CLAUDE_DEFAULT_CONFIG_SUBDIR, CLAUDE_KEYCHAIN_BASE_SERVICE_NAME, CLAUDE_KEYCHAIN_HASH_PREFIX_LENGTH, } from '../default-claude-http-transport.constants.js';
5
7
  /**
6
- * Expands a leading `'~/'` home-directory prefix on a Claude CLI `configDir` path.
8
+ * Expands a leading `'~'` or `'~/'` home-directory prefix on a Claude CLI `configDir` path.
7
9
  *
8
- * Returns `configDir` unchanged when it does not begin with `'~/'`.
10
+ * Returns `configDir` unchanged when it does not begin with `'~'`.
9
11
  *
10
12
  * @param {string} configDir - Raw `configDir` path from a `ClaudeAccountSeatNode`.
11
13
  *
12
- * @returns {string} Filesystem path with leading `'~/'` expanded.
14
+ * @returns {string} Filesystem path with leading `'~'` or `'~/'` expanded.
13
15
  */
14
16
  function expandClaudeConfigDirHome(configDir) {
17
+ if (configDir === '~') {
18
+ return homedir();
19
+ }
15
20
  if (configDir.startsWith('~/')) {
16
21
  return join(homedir(), configDir.slice(2));
17
22
  }
@@ -38,24 +43,32 @@ function resolveClaudeCredentialPaths(resolvedDir) {
38
43
  return Object.freeze(candidatePaths);
39
44
  }
40
45
  /**
41
- * Extracts a bearer token string from the raw text of a Claude CLI credential file.
46
+ * Extracts a bearer token string from the raw text of a Claude CLI credential file or Keychain entry.
42
47
  *
43
48
  * Parses JSON objects for `claudeAiOauth.accessToken`, `accessToken`, `access_token`, `oauthToken`,
44
- * or `token`, and falls back to the raw trimmed string if the file holds a plain-text token.
49
+ * or `token`, and falls back to the raw trimmed string if the payload holds a plain-text token.
45
50
  *
46
- * @param {string} rawText - Trimmed non-empty file contents.
51
+ * @param {string} rawText - Trimmed non-empty credential text.
47
52
  *
48
53
  * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no token field is present.
49
54
  */
50
55
  function parseClaudeCredentialFileText(rawText) {
51
56
  try {
52
57
  const parsed = JSON.parse(rawText);
53
- const nested = parsed['claudeAiOauth'];
58
+ if (typeof parsed === 'string') {
59
+ const trimmed = parsed.trim();
60
+ return trimmed.length > 0 ? trimmed : undefined;
61
+ }
62
+ if (parsed === null || typeof parsed !== 'object') {
63
+ return undefined;
64
+ }
65
+ const record = parsed;
66
+ const nested = record['claudeAiOauth'];
54
67
  const token = nested?.['accessToken'] ??
55
- parsed['accessToken'] ??
56
- parsed['access_token'] ??
57
- parsed['oauthToken'] ??
58
- parsed['token'];
68
+ record['accessToken'] ??
69
+ record['access_token'] ??
70
+ record['oauthToken'] ??
71
+ record['token'];
59
72
  if (typeof token === 'string' && token.trim().length > 0) {
60
73
  return token.trim();
61
74
  }
@@ -66,17 +79,13 @@ function parseClaudeCredentialFileText(rawText) {
66
79
  }
67
80
  }
68
81
  /**
69
- * Extracts an OAuth bearer token string from a Claude CLI `configDir` path on disk when present.
82
+ * Searches disk credential files inside `resolvedDir` for a Claude CLI OAuth bearer token.
70
83
  *
71
- * Searches standard credential JSON files inside `configDir` (or `configDir` directly if it is a file)
72
- * and reads `claudeAiOauth.accessToken`, `accessToken`, `access_token`, `oauthToken`, or `token`.
84
+ * @param {string} resolvedDir - Expanded filesystem path to the Claude CLI configuration directory or file.
73
85
  *
74
- * @param {string} configDir - Filesystem path to the Claude CLI configuration directory.
75
- *
76
- * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no credential file exists.
86
+ * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no disk credential is found.
77
87
  */
78
- export function extractOAuthTokenFromConfigDir(configDir) {
79
- const resolvedDir = expandClaudeConfigDirHome(configDir);
88
+ function extractDiskOAuthToken(resolvedDir) {
80
89
  if (!existsSync(resolvedDir)) {
81
90
  return undefined;
82
91
  }
@@ -96,4 +105,104 @@ export function extractOAuthTokenFromConfigDir(configDir) {
96
105
  }
97
106
  return undefined;
98
107
  }
108
+ /**
109
+ * Computes the ordered list of macOS Keychain service names to query for `resolvedDir`.
110
+ *
111
+ * Queries `Claude Code-credentials-<sha256_prefix_8>` before falling back to `'Claude Code-credentials'`
112
+ * when `resolvedDir` differs from the default `~/.claude` directory.
113
+ *
114
+ * @param {string} resolvedDir - Expanded filesystem path to the Claude CLI configuration directory.
115
+ *
116
+ * @returns {readonly string[]} Ordered macOS Keychain service names to inspect.
117
+ */
118
+ function resolveClaudeKeychainServiceNames(resolvedDir) {
119
+ const defaultConfigDir = join(homedir(), CLAUDE_DEFAULT_CONFIG_SUBDIR).normalize('NFC');
120
+ const normalizedDir = resolvedDir.normalize('NFC');
121
+ if (normalizedDir === defaultConfigDir) {
122
+ return Object.freeze([CLAUDE_KEYCHAIN_BASE_SERVICE_NAME]);
123
+ }
124
+ const digestPrefix = createHash('sha256')
125
+ .update(normalizedDir)
126
+ .digest('hex')
127
+ .slice(0, CLAUDE_KEYCHAIN_HASH_PREFIX_LENGTH);
128
+ return Object.freeze([
129
+ `${CLAUDE_KEYCHAIN_BASE_SERVICE_NAME}-${digestPrefix}`,
130
+ CLAUDE_KEYCHAIN_BASE_SERVICE_NAME,
131
+ ]);
132
+ }
133
+ /**
134
+ * Reads a generic password secret from the macOS Keychain by service name via `/usr/bin/security`.
135
+ *
136
+ * Suppresses stderr and returns `undefined` when the Keychain entry is absent or inaccessible.
137
+ *
138
+ * @param {string} serviceName - macOS Keychain service name (`-s`).
139
+ *
140
+ * @returns {string | undefined} Trimmed secret payload, or `undefined` if not found.
141
+ */
142
+ function readMacOsKeychainService(serviceName) {
143
+ try {
144
+ const rawOutput = execFileSync('security', ['find-generic-password', '-s', serviceName, '-w'], {
145
+ encoding: 'utf8',
146
+ stdio: ['ignore', 'pipe', 'ignore'],
147
+ }).trim();
148
+ return rawOutput.length > 0 ? rawOutput : undefined;
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ }
154
+ /**
155
+ * Extracts an OAuth bearer token from macOS Keychain services corresponding to `resolvedDir`.
156
+ *
157
+ * @param {string} resolvedDir - Expanded Claude CLI configuration directory path.
158
+ * @param {(serviceName: string) => string | undefined} readService - Keychain service reader function.
159
+ *
160
+ * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no Keychain entry matches.
161
+ */
162
+ function extractMacOsKeychainOAuthToken(resolvedDir, readService) {
163
+ const serviceNames = resolveClaudeKeychainServiceNames(resolvedDir);
164
+ for (const serviceName of serviceNames) {
165
+ const rawSecret = readService(serviceName)?.trim();
166
+ if (rawSecret === undefined || rawSecret.length === 0) {
167
+ continue;
168
+ }
169
+ const token = parseClaudeCredentialFileText(rawSecret);
170
+ if (token !== undefined) {
171
+ return token;
172
+ }
173
+ }
174
+ return undefined;
175
+ }
176
+ /**
177
+ * Extracts an OAuth bearer token string from a Claude CLI `configDir` path on disk or macOS Keychain.
178
+ *
179
+ * Searches standard credential JSON files inside `configDir` first, and on macOS (`darwin`) falls back
180
+ * to querying the `"Claude Code-credentials"` Keychain entries when no disk credential file is present.
181
+ *
182
+ * @param {string} configDir - Filesystem path to the Claude CLI configuration directory.
183
+ * @param {ExtractOAuthTokenOptions | undefined} [options] - Optional platform and Keychain reader overrides.
184
+ *
185
+ * @returns {string | undefined} Extracted OAuth bearer token, or `undefined` if no credential is available.
186
+ */
187
+ export function extractOAuthTokenFromConfigDir(configDir, options) {
188
+ const resolvedDir = expandClaudeConfigDirHome(configDir);
189
+ if (options?.skipDiskLookup !== true) {
190
+ const diskToken = extractDiskOAuthToken(resolvedDir);
191
+ if (diskToken !== undefined) {
192
+ return diskToken;
193
+ }
194
+ }
195
+ const activePlatform = options?.platform ?? process.platform;
196
+ if (activePlatform !== 'darwin') {
197
+ return undefined;
198
+ }
199
+ const defaultConfigDir = join(homedir(), CLAUDE_DEFAULT_CONFIG_SUBDIR).normalize('NFC');
200
+ const isDefaultConfigDir = resolvedDir.normalize('NFC') === defaultConfigDir;
201
+ if (options?.readKeychainService === undefined &&
202
+ !isDefaultConfigDir &&
203
+ !existsSync(resolvedDir)) {
204
+ return undefined;
205
+ }
206
+ return extractMacOsKeychainOAuthToken(resolvedDir, options?.readKeychainService ?? readMacOsKeychainService);
207
+ }
99
208
  //# sourceMappingURL=extract-oauth-token-from-config-dir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extract-oauth-token-from-config-dir.js","sourceRoot":"","sources":["../../../src/driver/internal/extract-oauth-token-from-config-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAE5F;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAAC,SAAiB;IAClD,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,4BAA4B,CAAC,WAAmB;IACvD,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,QAAQ,IAAI,2BAA2B,EAAE,CAAC;QACnD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,6BAA6B,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAkD,CAAC;QACxF,MAAM,KAAK,GACT,MAAM,EAAE,CAAC,aAAa,CAAC;YACvB,MAAM,CAAC,aAAa,CAAC;YACrB,MAAM,CAAC,cAAc,CAAC;YACtB,MAAM,CAAC,YAAY,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,8BAA8B,CAAC,SAAiB;IAC9D,MAAM,WAAW,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACjE,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"extract-oauth-token-from-config-dir.js","sourceRoot":"","sources":["../../../src/driver/internal/extract-oauth-token-from-config-dir.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-claude-seat-auth.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;IAChD,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACtD;AA8CD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,cAAc,CAmCzF"}
1
+ {"version":3,"file":"resolve-claude-seat-auth.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;IAChD,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACtD;AAwDD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,cAAc,CAsCzF"}
@@ -1,10 +1,32 @@
1
- import { ANTHROPIC_API_VERSION } from '../default-claude-http-transport.constants.js';
1
+ import { ANTHROPIC_API_VERSION, ANTHROPIC_OAUTH_BETA_HEADER, CLAUDE_OAUTH_TOKEN_PREFIX, } from '../default-claude-http-transport.constants.js';
2
2
  import { extractOAuthTokenFromConfigDir } from './extract-oauth-token-from-config-dir.js';
3
+ /**
4
+ * Builds a frozen `ClaudeSeatAuth` record for an OAuth bearer token seat.
5
+ *
6
+ * Includes `anthropic-beta: 'oauth-2025-04-20'` alongside `authorization: 'Bearer <token>'`.
7
+ *
8
+ * @param {string | undefined} seatId - Active account seat identifier.
9
+ * @param {string} token - OAuth bearer token value.
10
+ *
11
+ * @returns {ClaudeSeatAuth} Frozen OAuth seat authentication record.
12
+ */
13
+ function buildClaudeOAuthSeatAuth(seatId, token) {
14
+ return Object.freeze({
15
+ seatId,
16
+ authSource: 'cli-oauth',
17
+ headers: Object.freeze({
18
+ 'content-type': 'application/json',
19
+ 'anthropic-version': ANTHROPIC_API_VERSION,
20
+ 'anthropic-beta': ANTHROPIC_OAUTH_BETA_HEADER,
21
+ authorization: `Bearer ${token}`,
22
+ }),
23
+ });
24
+ }
3
25
  /**
4
26
  * Attempts to resolve OAuth bearer authentication from `candidateSeat.configDir`.
5
27
  *
6
- * Returns `undefined` when `configDir` is absent or when `configDir` is missing on disk and a fallback
7
- * `apiKey` is configured on either the seat or the model pool's `fallbackItem`.
28
+ * Returns `undefined` when `configDir` is absent or when `configDir` has no credential on disk or
29
+ * macOS Keychain and a fallback `apiKey` is configured on either the seat or the model pool's `fallbackItem`.
8
30
  *
9
31
  * @param {ClaudeAccountSeatNode | undefined} candidateSeat - Active candidate account seat.
10
32
  * @param {ClaudeAccountSeatNode | undefined} fallbackSeat - Pool fallback account seat, if configured.
@@ -17,28 +39,12 @@ function tryResolveClaudeOAuthSeat(candidateSeat, fallbackSeat) {
17
39
  }
18
40
  const diskToken = extractOAuthTokenFromConfigDir(candidateSeat.configDir);
19
41
  if (diskToken !== undefined) {
20
- return Object.freeze({
21
- seatId: candidateSeat.id,
22
- authSource: 'cli-oauth',
23
- headers: Object.freeze({
24
- 'content-type': 'application/json',
25
- 'anthropic-version': ANTHROPIC_API_VERSION,
26
- authorization: `Bearer ${diskToken}`,
27
- }),
28
- });
42
+ return buildClaudeOAuthSeatAuth(candidateSeat.id, diskToken);
29
43
  }
30
44
  if (candidateSeat.apiKey !== undefined || fallbackSeat?.apiKey !== undefined) {
31
45
  return undefined;
32
46
  }
33
- return Object.freeze({
34
- seatId: candidateSeat.id,
35
- authSource: 'cli-oauth',
36
- headers: Object.freeze({
37
- 'content-type': 'application/json',
38
- 'anthropic-version': ANTHROPIC_API_VERSION,
39
- authorization: `Bearer oauth:${candidateSeat.id}:${candidateSeat.configDir}`,
40
- }),
41
- });
47
+ return buildClaudeOAuthSeatAuth(candidateSeat.id, `oauth:${candidateSeat.id}:${candidateSeat.configDir}`);
42
48
  }
43
49
  /**
44
50
  * Resolves Anthropic authentication headers and seat metadata for a single turn invocation.
@@ -62,6 +68,9 @@ export function resolveClaudeSeatAuth(params) {
62
68
  if (rawKey !== undefined) {
63
69
  const resolvedKey = typeof rawKey === 'string' ? rawKey : params.driverCtx?.resolveEnv(rawKey);
64
70
  if (resolvedKey !== undefined && resolvedKey.length > 0) {
71
+ if (resolvedKey.startsWith(CLAUDE_OAUTH_TOKEN_PREFIX)) {
72
+ return buildClaudeOAuthSeatAuth(apiKeySeat?.id, resolvedKey);
73
+ }
65
74
  return Object.freeze({
66
75
  seatId: apiKeySeat?.id,
67
76
  authSource: 'api-key',
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-claude-seat-auth.js","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-claude-seat-auth.js","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraharness/claude",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Anthropic Claude ModelDriver and AST builders for Paraharness supporting API key and CLI OAuth subscription seats, KV prefix caching, and thinking signature preservation.",
5
5
  "keywords": [
6
6
  "paraharness",