@vostride/agent-qa-subscription-auth 0.1.19 → 0.1.21

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/index.js CHANGED
@@ -197,6 +197,28 @@ function createAnthropicAuthFetch(getTokens, onRefreshed) {
197
197
  });
198
198
  }
199
199
  if (response.body) {
200
+ const contentType = response.headers.get("content-type") ?? "";
201
+ if (contentType.includes("application/json")) {
202
+ const rawText = await response.text();
203
+ const headers2 = new Headers(response.headers);
204
+ headers2.delete("content-length");
205
+ headers2.delete("content-encoding");
206
+ try {
207
+ const json = JSON.parse(rawText);
208
+ rewriteToolUseNames(json);
209
+ return new Response(JSON.stringify(json), {
210
+ status: response.status,
211
+ statusText: response.statusText,
212
+ headers: headers2
213
+ });
214
+ } catch {
215
+ return new Response(rawText, {
216
+ status: response.status,
217
+ statusText: response.statusText,
218
+ headers: headers2
219
+ });
220
+ }
221
+ }
200
222
  const stream = response.body.pipeThrough(createAnthropicToolNameTransform());
201
223
  return new Response(stream, {
202
224
  status: response.status,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/anthropic.ts","../src/openai-codex.ts","../src/index.ts"],"sourcesContent":["import {\n generatePKCE,\n type AuthProvider,\n type OAuthTokens,\n type TokenRefreshFn,\n} from '@vostride/agent-qa-core'\n\nexport const ANTHROPIC_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e'\nexport const ANTHROPIC_TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token'\nexport const ANTHROPIC_REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback'\nexport const ANTHROPIC_SCOPES = 'org:create_api_key user:profile user:inference'\nexport const ANTHROPIC_BETA_FLAGS = 'oauth-2025-04-20,interleaved-thinking-2025-05-14'\n\nconst SYSTEM_PREFIX = \"You are Claude Code, Anthropic's official CLI for Claude.\"\nconst TOOL_PREFIX = 'mcp_'\n\nconst AUTH_BASES: Record<string, string> = {\n max: 'https://claude.ai/oauth/authorize',\n console: 'https://console.anthropic.com/oauth/authorize',\n}\n\nexport function anthropicAuthorizeUrl(options: {\n mode: 'max' | 'console'\n pkce: { verifier: string; challenge: string }\n}): string {\n const base = AUTH_BASES[options.mode]\n const params = new URLSearchParams({\n code: 'true',\n client_id: ANTHROPIC_CLIENT_ID,\n response_type: 'code',\n redirect_uri: ANTHROPIC_REDIRECT_URI,\n scope: ANTHROPIC_SCOPES,\n code_challenge: options.pkce.challenge,\n code_challenge_method: 'S256',\n state: options.pkce.verifier,\n })\n return `${base}?${params.toString()}`\n}\n\nexport function startAnthropicAuth(): {\n authorizeUrl: string\n sessionState: { verifier: string }\n} {\n const pkce = generatePKCE()\n return {\n authorizeUrl: anthropicAuthorizeUrl({ mode: 'max', pkce }),\n sessionState: { verifier: pkce.verifier },\n }\n}\n\nfunction readVerifier(sessionState: unknown): string {\n if (\n sessionState\n && typeof sessionState === 'object'\n && typeof (sessionState as { verifier?: unknown }).verifier === 'string'\n ) {\n return (sessionState as { verifier: string }).verifier\n }\n throw new Error('Anthropic subscription auth session is missing PKCE verifier.')\n}\n\nexport async function exchangeAnthropicManualCode(ctx: {\n code: string\n sessionState: unknown\n}): Promise<OAuthTokens> {\n return await anthropicExchangeCode(ctx.code, { verifier: readVerifier(ctx.sessionState) })\n}\n\nexport async function anthropicExchangeCode(\n codeWithState: string,\n pkce: { verifier: string },\n): Promise<OAuthTokens> {\n const [code, state] = codeWithState.split('#')\n\n const res = await globalThis.fetch(ANTHROPIC_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n state: state ?? pkce.verifier,\n grant_type: 'authorization_code',\n client_id: ANTHROPIC_CLIENT_ID,\n redirect_uri: ANTHROPIC_REDIRECT_URI,\n code_verifier: pkce.verifier,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Anthropic token exchange failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.refresh_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Anthropic token exchange response is missing required fields')\n }\n\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n }\n}\n\nexport const anthropicRefreshTokens: TokenRefreshFn = async (\n _provider: AuthProvider,\n refreshToken: string,\n): Promise<OAuthTokens> => {\n const res = await globalThis.fetch(ANTHROPIC_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: ANTHROPIC_CLIENT_ID,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Anthropic token refresh failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Anthropic token refresh response is missing required fields')\n }\n\n return {\n access: json.access_token,\n refresh: typeof json.refresh_token === 'string' ? json.refresh_token : refreshToken,\n expires: Date.now() + json.expires_in * 1000,\n }\n}\n\nfunction prefixToolName(name: unknown): unknown {\n return typeof name === 'string' && !name.startsWith(TOOL_PREFIX) ? `${TOOL_PREFIX}${name}` : name\n}\n\nfunction stripToolNamePrefix(name: unknown): unknown {\n return typeof name === 'string' && name.startsWith(TOOL_PREFIX) ? name.slice(TOOL_PREFIX.length) : name\n}\n\nexport function createAnthropicAuthFetch(\n getTokens: () => Promise<OAuthTokens>,\n onRefreshed: (tokens: OAuthTokens) => Promise<void>,\n): typeof globalThis.fetch {\n return async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n let tokens = await getTokens()\n\n if (tokens.expires < Date.now()) {\n tokens = await anthropicRefreshTokens('anthropic-subscription', tokens.refresh)\n await onRefreshed(tokens)\n }\n\n const headers = new Headers()\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { headers.set(key, value) })\n }\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => { headers.set(key, value) })\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n if (value !== undefined) headers.set(key, String(value))\n }\n } else {\n for (const [key, value] of Object.entries(init.headers)) {\n if (value !== undefined) headers.set(key, String(value))\n }\n }\n }\n\n const incoming = (headers.get('anthropic-beta') || '').split(',').map((b) => b.trim()).filter(Boolean)\n const required = ANTHROPIC_BETA_FLAGS.split(',')\n const merged = [...new Set([...required, ...incoming])].join(',')\n\n headers.delete('authorization')\n headers.delete('x-api-key')\n headers.set('Authorization', `Bearer ${tokens.access}`)\n headers.set('anthropic-beta', merged)\n headers.set('user-agent', 'claude-cli/2.1.2 (external, cli)')\n\n let body = init?.body\n if (body && typeof body === 'string') {\n try {\n const parsed = JSON.parse(body)\n\n if (parsed.system && Array.isArray(parsed.system)) {\n parsed.system = [{ type: 'text', text: SYSTEM_PREFIX }, ...parsed.system]\n } else if (typeof parsed.system === 'string') {\n parsed.system = SYSTEM_PREFIX + '\\n\\n' + parsed.system\n } else if (!parsed.system) {\n parsed.system = [{ type: 'text', text: SYSTEM_PREFIX }]\n }\n\n if (parsed.tools && Array.isArray(parsed.tools)) {\n parsed.tools = parsed.tools.map((tool: Record<string, unknown>) => ({\n ...tool,\n name: prefixToolName(tool.name),\n }))\n }\n\n if (parsed.messages && Array.isArray(parsed.messages)) {\n parsed.messages = parsed.messages.map((msg: Record<string, unknown>) => {\n if (msg.content && Array.isArray(msg.content)) {\n msg.content = msg.content.map((block: Record<string, unknown>) => {\n if (block.type === 'tool_use' && block.name) {\n return { ...block, name: prefixToolName(block.name) }\n }\n return block\n })\n }\n return msg\n })\n }\n\n body = JSON.stringify(parsed)\n } catch {\n // Leave non-JSON request bodies unchanged.\n }\n }\n\n let url: string\n if (typeof input === 'string') url = input\n else if (input instanceof URL) url = input.toString()\n else url = input.url\n\n try {\n const parsed = new URL(url)\n if (parsed.pathname === '/v1/messages' && !parsed.searchParams.has('beta')) {\n parsed.searchParams.set('beta', 'true')\n url = parsed.toString()\n }\n } catch {\n // Leave invalid URLs unchanged.\n }\n\n const response = await globalThis.fetch(url, {\n ...init,\n body,\n headers,\n })\n\n if (!response.ok) {\n const text = await response.text()\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n if (response.body) {\n const stream = response.body.pipeThrough(createAnthropicToolNameTransform())\n\n return new Response(stream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n return response\n }\n}\n\nfunction createAnthropicToolNameTransform(): TransformStream<Uint8Array, Uint8Array> {\n const decoder = new TextDecoder()\n const encoder = new TextEncoder()\n let pending = ''\n\n return new TransformStream({\n transform(chunk, controller) {\n pending += decoder.decode(chunk, { stream: true })\n\n let newlineIndex = pending.indexOf('\\n')\n while (newlineIndex !== -1) {\n const line = pending.slice(0, newlineIndex + 1)\n pending = pending.slice(newlineIndex + 1)\n controller.enqueue(encoder.encode(rewriteAnthropicEventLine(line)))\n newlineIndex = pending.indexOf('\\n')\n }\n },\n flush(controller) {\n pending += decoder.decode()\n if (pending) {\n controller.enqueue(encoder.encode(rewriteAnthropicEventLine(pending)))\n pending = ''\n }\n },\n })\n}\n\nfunction rewriteAnthropicEventLine(line: string): string {\n const match = /^(data:\\s*)(.*?)(\\r?\\n?)$/.exec(line)\n if (!match) return line\n\n const [, prefix, jsonText, suffix] = match\n if (!jsonText || jsonText === '[DONE]') return line\n\n try {\n const event = JSON.parse(jsonText)\n rewriteToolUseNames(event)\n return `${prefix}${JSON.stringify(event)}${suffix}`\n } catch {\n return line\n }\n}\n\nfunction rewriteToolUseNames(value: unknown): void {\n if (!value || typeof value !== 'object') return\n\n if (Array.isArray(value)) {\n for (const item of value) rewriteToolUseNames(item)\n return\n }\n\n const record = value as Record<string, unknown>\n if (record.type === 'tool_use') {\n record.name = stripToolNamePrefix(record.name)\n }\n\n for (const item of Object.values(record)) {\n rewriteToolUseNames(item)\n }\n}\n","import { createServer, type Server } from 'node:http'\nimport {\n createAuthFetch,\n generatePKCE,\n generateState,\n type AuthProvider,\n type OAuthTokens,\n type TokenRefreshFn,\n} from '@vostride/agent-qa-core'\n\nexport const CODEX_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\nexport const CODEX_AUTH_BASE = 'https://auth.openai.com'\nexport const CODEX_TOKEN_URL = 'https://auth.openai.com/oauth/token'\nexport const CODEX_SCOPES = 'openid profile email offline_access'\nexport const CODEX_API_URL = 'https://chatgpt.com/backend-api/codex/responses'\nexport const CODEX_DEFAULT_PORT = 1455\nexport const CODEX_CALLBACK_HOST = 'localhost'\nexport const CODEX_LISTEN_HOST = '127.0.0.1'\n\ntype JSONRecord = Record<string, unknown>\n\nexport function decodeJwtClaims(token: string): Record<string, unknown> {\n const parts = token.split('.')\n if (parts.length < 3) throw new Error('Invalid JWT: expected 3 segments')\n const payload = parts[1]\n const decoded = Buffer.from(payload, 'base64url').toString('utf-8')\n return JSON.parse(decoded)\n}\n\nfunction extractAccountId(idToken: string): string | undefined {\n try {\n const claims = decodeJwtClaims(idToken)\n const authClaim = claims['https://api.openai.com/auth'] as\n | Record<string, unknown>\n | undefined\n if (authClaim && typeof authClaim === 'object') {\n const userIdStr =\n (authClaim.user_id as string) ?? (authClaim.account_id as string)\n if (userIdStr) return userIdStr\n }\n return (claims.sub as string) ?? undefined\n } catch {\n return undefined\n }\n}\n\nexport async function codexExchangeCode(\n code: string,\n redirectUri: string,\n pkce: { verifier: string },\n): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CODEX_CLIENT_ID,\n code,\n redirect_uri: redirectUri,\n code_verifier: pkce.verifier,\n })\n\n const res = await globalThis.fetch(CODEX_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Codex token exchange failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n id_token?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.refresh_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Codex token exchange response is missing required fields')\n }\n\n const accountId = typeof json.id_token === 'string'\n ? extractAccountId(json.id_token)\n : undefined\n\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n }\n}\n\nexport const codexRefreshTokens: TokenRefreshFn = async (\n _provider: AuthProvider,\n refreshToken: string,\n): Promise<OAuthTokens> => {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CODEX_CLIENT_ID,\n refresh_token: refreshToken,\n })\n\n const res = await globalThis.fetch(CODEX_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Codex token refresh failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n id_token?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Codex token refresh response is missing required fields')\n }\n\n const accountId = typeof json.id_token === 'string'\n ? extractAccountId(json.id_token)\n : undefined\n\n return {\n access: json.access_token,\n refresh: typeof json.refresh_token === 'string' ? json.refresh_token : refreshToken,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n }\n}\n\nexport async function codexBrowserAuth(options?: {\n port?: number\n listenHost?: string\n}): Promise<{\n authorizeUrl: string\n waitForCallback: Promise<OAuthTokens>\n cleanup: () => void\n}> {\n const port = options?.port ?? CODEX_DEFAULT_PORT\n const listenHost = options?.listenHost ?? CODEX_LISTEN_HOST\n const redirectUri = `http://${CODEX_CALLBACK_HOST}:${port}/auth/callback`\n const pkce = generatePKCE()\n const state = generateState()\n\n let server: Server\n let resolveTokens: (tokens: OAuthTokens) => void\n let rejectTokens: (err: Error) => void\n\n const waitForCallback = new Promise<OAuthTokens>((resolve, reject) => {\n resolveTokens = resolve\n rejectTokens = reject\n })\n\n server = createServer(async (req, res) => {\n const url = new URL(req.url ?? '/', redirectUri)\n\n if (url.pathname === '/auth/callback') {\n const code = url.searchParams.get('code')\n const returnedState = url.searchParams.get('state')\n\n if (returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body>State mismatch. Please try again.</body></html>')\n rejectTokens(new Error('OAuth state mismatch'))\n return\n }\n\n if (!code) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body>Missing authorization code.</body></html>')\n rejectTokens(new Error('Missing authorization code'))\n return\n }\n\n try {\n const tokens = await codexExchangeCode(code, redirectUri, {\n verifier: pkce.verifier,\n })\n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(\n '<html><body>Authentication successful! You can close this tab.</body></html>',\n )\n resolveTokens(tokens)\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html' })\n res.end('<html><body>Token exchange failed.</body></html>')\n rejectTokens(\n err instanceof Error ? err : new Error('Token exchange failed'),\n )\n }\n } else {\n res.writeHead(404)\n res.end()\n }\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(port, listenHost, () => {\n server.off('error', reject)\n resolve()\n })\n })\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: CODEX_CLIENT_ID,\n redirect_uri: redirectUri,\n scope: CODEX_SCOPES,\n state,\n code_challenge: pkce.challenge,\n code_challenge_method: 'S256',\n })\n\n const authorizeUrl = `${CODEX_AUTH_BASE}/oauth/authorize?${params.toString()}`\n\n const cleanup = () => {\n server.close()\n }\n\n return { authorizeUrl, waitForCallback, cleanup }\n}\n\nexport function createCodexAuthFetch(\n getTokens: () => Promise<OAuthTokens>,\n onRefreshed: (tokens: OAuthTokens) => Promise<void>,\n): typeof globalThis.fetch {\n const authFetch = createAuthFetch({\n provider: 'openai-codex',\n getTokens,\n refreshTokens: codexRefreshTokens,\n onTokensRefreshed: onRefreshed,\n headerTransform: (headers, tokens) => {\n if (tokens.accountId) {\n headers.set('ChatGPT-Account-Id', tokens.accountId)\n }\n },\n urlTransform: (url) => {\n if (url.includes('/v1/responses') || url.includes('/chat/completions')) {\n return CODEX_API_URL\n }\n return url\n },\n })\n\n return async (input, init) => {\n const inputUrl = extractRequestUrl(input)\n let forceStream = false\n let body = init?.body\n\n if (isCodexRequestUrl(inputUrl) && body && typeof body === 'string') {\n try {\n const parsed = JSON.parse(body)\n if (!parsed.stream) {\n parsed.stream = true\n forceStream = true\n }\n if (parsed.text?.format?.strict) {\n parsed.text.format.strict = false\n }\n body = JSON.stringify(parsed)\n } catch {\n // Leave non-JSON request bodies unchanged.\n }\n }\n\n const response = await authFetch(input, { ...init, body })\n if (forceStream && response.ok && response.body) {\n return bufferCodexSSEResponse(response)\n }\n return response\n }\n}\n\nfunction extractRequestUrl(input: string | URL | Request): string {\n if (typeof input === 'string') return input\n if (input instanceof URL) return input.toString()\n return input.url\n}\n\nfunction isCodexRequestUrl(url: string): boolean {\n return url.includes('/v1/responses')\n || url.includes('/chat/completions')\n || url.includes('chatgpt.com/backend-api/codex')\n}\n\nasync function bufferCodexSSEResponse(response: Response): Promise<Response> {\n const reader = response.body!.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let completedResponse: JSONRecord | null = null\n let outputText = ''\n const pendingOutputItems = new Map<number, JSONRecord>()\n const completedOutputItems = new Map<number, JSONRecord>()\n const functionCallArgumentDeltas = new Map<number, string>()\n const customToolInputDeltas = new Map<number, string>()\n\n const overallTimeout = setTimeout(() => {\n try { reader.cancel() } catch { /* ignore */ }\n }, 120_000)\n\n try {\n while (true) {\n const chunkPromise = reader.read()\n const timeoutPromise = new Promise<{ done: true; value: undefined }>((resolve) =>\n setTimeout(() => resolve({ done: true, value: undefined }), 30_000)\n )\n const { done, value } = await Promise.race([chunkPromise, timeoutPromise])\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n try {\n const event = JSON.parse(data)\n if (!isJSONRecord(event) || typeof event.type !== 'string') continue\n\n if (event.type === 'response.output_text.delta' && typeof event.delta === 'string') {\n outputText += event.delta\n }\n\n if (event.type === 'response.output_item.added'\n && typeof event.output_index === 'number'\n && isJSONRecord(event.item)\n ) {\n pendingOutputItems.set(event.output_index, { ...event.item })\n }\n\n if (event.type === 'response.function_call_arguments.delta'\n && typeof event.output_index === 'number'\n && typeof event.delta === 'string'\n ) {\n const prev = functionCallArgumentDeltas.get(event.output_index) ?? ''\n functionCallArgumentDeltas.set(event.output_index, prev + event.delta)\n }\n\n if (event.type === 'response.custom_tool_call_input.delta'\n && typeof event.output_index === 'number'\n && typeof event.delta === 'string'\n ) {\n const prev = customToolInputDeltas.get(event.output_index) ?? ''\n customToolInputDeltas.set(event.output_index, prev + event.delta)\n }\n\n if (event.type === 'response.output_item.done'\n && typeof event.output_index === 'number'\n && isJSONRecord(event.item)\n ) {\n completedOutputItems.set(\n event.output_index,\n hydrateOutputItem(event.item, event.output_index, functionCallArgumentDeltas, customToolInputDeltas),\n )\n }\n\n if ((event.type === 'response.completed' || event.type === 'response.incomplete')\n && isJSONRecord(event.response)\n ) {\n completedResponse = event.response\n }\n } catch {\n // Ignore malformed SSE payloads.\n }\n }\n }\n } finally {\n clearTimeout(overallTimeout)\n }\n\n for (const [outputIndex, item] of pendingOutputItems) {\n if (!completedOutputItems.has(outputIndex)) {\n completedOutputItems.set(\n outputIndex,\n hydrateOutputItem(item, outputIndex, functionCallArgumentDeltas, customToolInputDeltas),\n )\n }\n }\n\n const bufferedOutput = [...completedOutputItems.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, item]) => item)\n\n const body = JSON.stringify(\n ensureResponseMetadata(\n completedResponse\n ? mergeBufferedOutputItems(completedResponse, bufferedOutput, outputText)\n : createBufferedResponse(bufferedOutput, outputText),\n ),\n )\n\n return new Response(body, {\n status: 200,\n headers: { 'content-type': 'application/json' },\n })\n}\n\nfunction isJSONRecord(value: unknown): value is JSONRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction hydrateOutputItem(\n item: JSONRecord,\n outputIndex: number,\n functionCallArgumentDeltas: Map<number, string>,\n customToolInputDeltas: Map<number, string>,\n): JSONRecord {\n const hydrated = { ...item }\n\n if (hydrated.type === 'function_call' && typeof hydrated.arguments !== 'string') {\n hydrated.arguments = functionCallArgumentDeltas.get(outputIndex) ?? ''\n }\n\n if (hydrated.type === 'custom_tool_call' && hydrated.input == null) {\n const input = customToolInputDeltas.get(outputIndex)\n if (input !== undefined) {\n hydrated.input = safeParseJSON(input) ?? input\n }\n }\n\n return hydrated\n}\n\nfunction mergeBufferedOutputItems(\n response: JSONRecord,\n bufferedOutput: JSONRecord[],\n outputText: string,\n): JSONRecord {\n const existingOutput = Array.isArray(response.output)\n ? response.output.filter(isJSONRecord)\n : []\n\n if (bufferedOutput.length === 0) {\n if (existingOutput.length > 0) return response\n return { ...response, output: [buildTextOutput(outputText)] }\n }\n\n const mergedOutput = [...existingOutput]\n const seenKeys = new Set(existingOutput.map(getOutputItemKey).filter((key): key is string => key !== null))\n\n for (const item of bufferedOutput) {\n const key = getOutputItemKey(item)\n if (key && seenKeys.has(key)) continue\n if (key) seenKeys.add(key)\n mergedOutput.push(item)\n }\n\n return { ...response, output: mergedOutput }\n}\n\nfunction createBufferedResponse(bufferedOutput: JSONRecord[], outputText: string): JSONRecord {\n return {\n id: 'codex-buffered',\n output: bufferedOutput.length > 0 ? bufferedOutput : [buildTextOutput(outputText)],\n status: 'completed',\n }\n}\n\nfunction ensureResponseMetadata(response: JSONRecord): JSONRecord {\n if (typeof response.created_at === 'number') return response\n\n return {\n ...response,\n created_at: Math.floor(Date.now() / 1000),\n }\n}\n\nfunction buildTextOutput(outputText: string): JSONRecord {\n return {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: outputText, annotations: [] }],\n }\n}\n\nfunction getOutputItemKey(item: JSONRecord): string | null {\n const type = typeof item.type === 'string' ? item.type : 'unknown'\n\n if (typeof item.id === 'string') return `${type}:${item.id}`\n if (typeof item.call_id === 'string') return `${type}:${item.call_id}`\n\n return null\n}\n\nfunction safeParseJSON(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n","import type { LLMAuthProviderPlugin } from '@vostride/agent-qa-core'\nimport { createAnthropicAuthFetch, exchangeAnthropicManualCode, startAnthropicAuth } from './anthropic.js'\nimport { codexBrowserAuth, createCodexAuthFetch } from './openai-codex.js'\n\nexport function createSubscriptionAuthPlugin(): { providers: LLMAuthProviderPlugin[] } {\n return {\n providers: [\n {\n providerId: 'openai-subscription',\n credentialProviderId: 'openai-subscription-oauth',\n label: 'OpenAI subscription',\n modelAdapter: 'openai-responses',\n dashboardAuth: { mode: 'browser-poll', buttonLabel: 'Login with OpenAI subscription' },\n async startAuth() {\n const result = await codexBrowserAuth()\n return {\n authorizeUrl: result.authorizeUrl,\n waitForTokens: result.waitForCallback,\n cleanup: result.cleanup,\n }\n },\n createAuthFetch({ getTokens, onRefreshed }) {\n return createCodexAuthFetch(getTokens, onRefreshed)\n },\n },\n {\n providerId: 'anthropic-subscription',\n credentialProviderId: 'anthropic-subscription',\n label: 'Anthropic subscription',\n modelAdapter: 'anthropic-messages',\n dashboardAuth: { mode: 'manual-code', buttonLabel: 'Login with Anthropic subscription' },\n async startAuth() {\n return startAnthropicAuth()\n },\n async exchangeCode(ctx) {\n return await exchangeAnthropicManualCode(ctx)\n },\n createAuthFetch({ getTokens, onRefreshed }) {\n return createAnthropicAuthFetch(getTokens, onRefreshed)\n },\n },\n ],\n }\n}\n\nexport default createSubscriptionAuthPlugin\n\nexport {\n ANTHROPIC_BETA_FLAGS,\n ANTHROPIC_CLIENT_ID,\n ANTHROPIC_REDIRECT_URI,\n ANTHROPIC_SCOPES,\n ANTHROPIC_TOKEN_URL,\n anthropicAuthorizeUrl,\n anthropicExchangeCode,\n anthropicRefreshTokens,\n createAnthropicAuthFetch,\n} from './anthropic.js'\n\nexport {\n CODEX_API_URL,\n CODEX_AUTH_BASE,\n CODEX_CLIENT_ID,\n CODEX_DEFAULT_PORT,\n CODEX_SCOPES,\n CODEX_TOKEN_URL,\n codexBrowserAuth,\n codexExchangeCode,\n codexRefreshTokens,\n createCodexAuthFetch,\n decodeJwtClaims,\n} from './openai-codex.js'\n"],"mappings":"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","names":["generatePKCE"]}
1
+ {"version":3,"sources":["../src/anthropic.ts","../src/openai-codex.ts","../src/index.ts"],"sourcesContent":["import {\n generatePKCE,\n type AuthProvider,\n type OAuthTokens,\n type TokenRefreshFn,\n} from '@vostride/agent-qa-core'\n\nexport const ANTHROPIC_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e'\nexport const ANTHROPIC_TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token'\nexport const ANTHROPIC_REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback'\nexport const ANTHROPIC_SCOPES = 'org:create_api_key user:profile user:inference'\nexport const ANTHROPIC_BETA_FLAGS = 'oauth-2025-04-20,interleaved-thinking-2025-05-14'\n\nconst SYSTEM_PREFIX = \"You are Claude Code, Anthropic's official CLI for Claude.\"\nconst TOOL_PREFIX = 'mcp_'\n\nconst AUTH_BASES: Record<string, string> = {\n max: 'https://claude.ai/oauth/authorize',\n console: 'https://console.anthropic.com/oauth/authorize',\n}\n\nexport function anthropicAuthorizeUrl(options: {\n mode: 'max' | 'console'\n pkce: { verifier: string; challenge: string }\n}): string {\n const base = AUTH_BASES[options.mode]\n const params = new URLSearchParams({\n code: 'true',\n client_id: ANTHROPIC_CLIENT_ID,\n response_type: 'code',\n redirect_uri: ANTHROPIC_REDIRECT_URI,\n scope: ANTHROPIC_SCOPES,\n code_challenge: options.pkce.challenge,\n code_challenge_method: 'S256',\n state: options.pkce.verifier,\n })\n return `${base}?${params.toString()}`\n}\n\nexport function startAnthropicAuth(): {\n authorizeUrl: string\n sessionState: { verifier: string }\n} {\n const pkce = generatePKCE()\n return {\n authorizeUrl: anthropicAuthorizeUrl({ mode: 'max', pkce }),\n sessionState: { verifier: pkce.verifier },\n }\n}\n\nfunction readVerifier(sessionState: unknown): string {\n if (\n sessionState\n && typeof sessionState === 'object'\n && typeof (sessionState as { verifier?: unknown }).verifier === 'string'\n ) {\n return (sessionState as { verifier: string }).verifier\n }\n throw new Error('Anthropic subscription auth session is missing PKCE verifier.')\n}\n\nexport async function exchangeAnthropicManualCode(ctx: {\n code: string\n sessionState: unknown\n}): Promise<OAuthTokens> {\n return await anthropicExchangeCode(ctx.code, { verifier: readVerifier(ctx.sessionState) })\n}\n\nexport async function anthropicExchangeCode(\n codeWithState: string,\n pkce: { verifier: string },\n): Promise<OAuthTokens> {\n const [code, state] = codeWithState.split('#')\n\n const res = await globalThis.fetch(ANTHROPIC_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n state: state ?? pkce.verifier,\n grant_type: 'authorization_code',\n client_id: ANTHROPIC_CLIENT_ID,\n redirect_uri: ANTHROPIC_REDIRECT_URI,\n code_verifier: pkce.verifier,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Anthropic token exchange failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.refresh_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Anthropic token exchange response is missing required fields')\n }\n\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n }\n}\n\nexport const anthropicRefreshTokens: TokenRefreshFn = async (\n _provider: AuthProvider,\n refreshToken: string,\n): Promise<OAuthTokens> => {\n const res = await globalThis.fetch(ANTHROPIC_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: ANTHROPIC_CLIENT_ID,\n }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Anthropic token refresh failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Anthropic token refresh response is missing required fields')\n }\n\n return {\n access: json.access_token,\n refresh: typeof json.refresh_token === 'string' ? json.refresh_token : refreshToken,\n expires: Date.now() + json.expires_in * 1000,\n }\n}\n\nfunction prefixToolName(name: unknown): unknown {\n return typeof name === 'string' && !name.startsWith(TOOL_PREFIX) ? `${TOOL_PREFIX}${name}` : name\n}\n\nfunction stripToolNamePrefix(name: unknown): unknown {\n return typeof name === 'string' && name.startsWith(TOOL_PREFIX) ? name.slice(TOOL_PREFIX.length) : name\n}\n\nexport function createAnthropicAuthFetch(\n getTokens: () => Promise<OAuthTokens>,\n onRefreshed: (tokens: OAuthTokens) => Promise<void>,\n): typeof globalThis.fetch {\n return async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n let tokens = await getTokens()\n\n if (tokens.expires < Date.now()) {\n tokens = await anthropicRefreshTokens('anthropic-subscription', tokens.refresh)\n await onRefreshed(tokens)\n }\n\n const headers = new Headers()\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { headers.set(key, value) })\n }\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => { headers.set(key, value) })\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n if (value !== undefined) headers.set(key, String(value))\n }\n } else {\n for (const [key, value] of Object.entries(init.headers)) {\n if (value !== undefined) headers.set(key, String(value))\n }\n }\n }\n\n const incoming = (headers.get('anthropic-beta') || '').split(',').map((b) => b.trim()).filter(Boolean)\n const required = ANTHROPIC_BETA_FLAGS.split(',')\n const merged = [...new Set([...required, ...incoming])].join(',')\n\n headers.delete('authorization')\n headers.delete('x-api-key')\n headers.set('Authorization', `Bearer ${tokens.access}`)\n headers.set('anthropic-beta', merged)\n headers.set('user-agent', 'claude-cli/2.1.2 (external, cli)')\n\n let body = init?.body\n if (body && typeof body === 'string') {\n try {\n const parsed = JSON.parse(body)\n\n if (parsed.system && Array.isArray(parsed.system)) {\n parsed.system = [{ type: 'text', text: SYSTEM_PREFIX }, ...parsed.system]\n } else if (typeof parsed.system === 'string') {\n parsed.system = SYSTEM_PREFIX + '\\n\\n' + parsed.system\n } else if (!parsed.system) {\n parsed.system = [{ type: 'text', text: SYSTEM_PREFIX }]\n }\n\n if (parsed.tools && Array.isArray(parsed.tools)) {\n parsed.tools = parsed.tools.map((tool: Record<string, unknown>) => ({\n ...tool,\n name: prefixToolName(tool.name),\n }))\n }\n\n if (parsed.messages && Array.isArray(parsed.messages)) {\n parsed.messages = parsed.messages.map((msg: Record<string, unknown>) => {\n if (msg.content && Array.isArray(msg.content)) {\n msg.content = msg.content.map((block: Record<string, unknown>) => {\n if (block.type === 'tool_use' && block.name) {\n return { ...block, name: prefixToolName(block.name) }\n }\n return block\n })\n }\n return msg\n })\n }\n\n body = JSON.stringify(parsed)\n } catch {\n // Leave non-JSON request bodies unchanged.\n }\n }\n\n let url: string\n if (typeof input === 'string') url = input\n else if (input instanceof URL) url = input.toString()\n else url = input.url\n\n try {\n const parsed = new URL(url)\n if (parsed.pathname === '/v1/messages' && !parsed.searchParams.has('beta')) {\n parsed.searchParams.set('beta', 'true')\n url = parsed.toString()\n }\n } catch {\n // Leave invalid URLs unchanged.\n }\n\n const response = await globalThis.fetch(url, {\n ...init,\n body,\n headers,\n })\n\n if (!response.ok) {\n const text = await response.text()\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n if (response.body) {\n // Non-streaming responses (generateText / `stream: false`) arrive as a\n // single JSON body. The SSE transform below only rewrites `data:` lines,\n // so without this branch tool_use names stay prefixed (e.g. `mcp_search`\n // never maps back to `search`) and the caller fails with\n // \"Unknown tool: mcp_search\". Rewrite the parsed body directly instead.\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n const rawText = await response.text()\n const headers = new Headers(response.headers)\n // Body length/encoding change after rewriting; drop stale framing headers.\n headers.delete('content-length')\n headers.delete('content-encoding')\n try {\n const json = JSON.parse(rawText)\n rewriteToolUseNames(json)\n return new Response(JSON.stringify(json), {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n } catch {\n return new Response(rawText, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }\n }\n\n const stream = response.body.pipeThrough(createAnthropicToolNameTransform())\n\n return new Response(stream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n return response\n }\n}\n\nfunction createAnthropicToolNameTransform(): TransformStream<Uint8Array, Uint8Array> {\n const decoder = new TextDecoder()\n const encoder = new TextEncoder()\n let pending = ''\n\n return new TransformStream({\n transform(chunk, controller) {\n pending += decoder.decode(chunk, { stream: true })\n\n let newlineIndex = pending.indexOf('\\n')\n while (newlineIndex !== -1) {\n const line = pending.slice(0, newlineIndex + 1)\n pending = pending.slice(newlineIndex + 1)\n controller.enqueue(encoder.encode(rewriteAnthropicEventLine(line)))\n newlineIndex = pending.indexOf('\\n')\n }\n },\n flush(controller) {\n pending += decoder.decode()\n if (pending) {\n controller.enqueue(encoder.encode(rewriteAnthropicEventLine(pending)))\n pending = ''\n }\n },\n })\n}\n\nfunction rewriteAnthropicEventLine(line: string): string {\n const match = /^(data:\\s*)(.*?)(\\r?\\n?)$/.exec(line)\n if (!match) return line\n\n const [, prefix, jsonText, suffix] = match\n if (!jsonText || jsonText === '[DONE]') return line\n\n try {\n const event = JSON.parse(jsonText)\n rewriteToolUseNames(event)\n return `${prefix}${JSON.stringify(event)}${suffix}`\n } catch {\n return line\n }\n}\n\nfunction rewriteToolUseNames(value: unknown): void {\n if (!value || typeof value !== 'object') return\n\n if (Array.isArray(value)) {\n for (const item of value) rewriteToolUseNames(item)\n return\n }\n\n const record = value as Record<string, unknown>\n if (record.type === 'tool_use') {\n record.name = stripToolNamePrefix(record.name)\n }\n\n for (const item of Object.values(record)) {\n rewriteToolUseNames(item)\n }\n}\n","import { createServer, type Server } from 'node:http'\nimport {\n createAuthFetch,\n generatePKCE,\n generateState,\n type AuthProvider,\n type OAuthTokens,\n type TokenRefreshFn,\n} from '@vostride/agent-qa-core'\n\nexport const CODEX_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\nexport const CODEX_AUTH_BASE = 'https://auth.openai.com'\nexport const CODEX_TOKEN_URL = 'https://auth.openai.com/oauth/token'\nexport const CODEX_SCOPES = 'openid profile email offline_access'\nexport const CODEX_API_URL = 'https://chatgpt.com/backend-api/codex/responses'\nexport const CODEX_DEFAULT_PORT = 1455\nexport const CODEX_CALLBACK_HOST = 'localhost'\nexport const CODEX_LISTEN_HOST = '127.0.0.1'\n\ntype JSONRecord = Record<string, unknown>\n\nexport function decodeJwtClaims(token: string): Record<string, unknown> {\n const parts = token.split('.')\n if (parts.length < 3) throw new Error('Invalid JWT: expected 3 segments')\n const payload = parts[1]\n const decoded = Buffer.from(payload, 'base64url').toString('utf-8')\n return JSON.parse(decoded)\n}\n\nfunction extractAccountId(idToken: string): string | undefined {\n try {\n const claims = decodeJwtClaims(idToken)\n const authClaim = claims['https://api.openai.com/auth'] as\n | Record<string, unknown>\n | undefined\n if (authClaim && typeof authClaim === 'object') {\n const userIdStr =\n (authClaim.user_id as string) ?? (authClaim.account_id as string)\n if (userIdStr) return userIdStr\n }\n return (claims.sub as string) ?? undefined\n } catch {\n return undefined\n }\n}\n\nexport async function codexExchangeCode(\n code: string,\n redirectUri: string,\n pkce: { verifier: string },\n): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CODEX_CLIENT_ID,\n code,\n redirect_uri: redirectUri,\n code_verifier: pkce.verifier,\n })\n\n const res = await globalThis.fetch(CODEX_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Codex token exchange failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n id_token?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.refresh_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Codex token exchange response is missing required fields')\n }\n\n const accountId = typeof json.id_token === 'string'\n ? extractAccountId(json.id_token)\n : undefined\n\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n }\n}\n\nexport const codexRefreshTokens: TokenRefreshFn = async (\n _provider: AuthProvider,\n refreshToken: string,\n): Promise<OAuthTokens> => {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CODEX_CLIENT_ID,\n refresh_token: refreshToken,\n })\n\n const res = await globalThis.fetch(CODEX_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`Codex token refresh failed: ${text}`)\n }\n\n const json = (await res.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n id_token?: unknown\n }\n\n if (\n typeof json.access_token !== 'string'\n || typeof json.expires_in !== 'number'\n ) {\n throw new Error('Codex token refresh response is missing required fields')\n }\n\n const accountId = typeof json.id_token === 'string'\n ? extractAccountId(json.id_token)\n : undefined\n\n return {\n access: json.access_token,\n refresh: typeof json.refresh_token === 'string' ? json.refresh_token : refreshToken,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n }\n}\n\nexport async function codexBrowserAuth(options?: {\n port?: number\n listenHost?: string\n}): Promise<{\n authorizeUrl: string\n waitForCallback: Promise<OAuthTokens>\n cleanup: () => void\n}> {\n const port = options?.port ?? CODEX_DEFAULT_PORT\n const listenHost = options?.listenHost ?? CODEX_LISTEN_HOST\n const redirectUri = `http://${CODEX_CALLBACK_HOST}:${port}/auth/callback`\n const pkce = generatePKCE()\n const state = generateState()\n\n let server: Server\n let resolveTokens: (tokens: OAuthTokens) => void\n let rejectTokens: (err: Error) => void\n\n const waitForCallback = new Promise<OAuthTokens>((resolve, reject) => {\n resolveTokens = resolve\n rejectTokens = reject\n })\n\n server = createServer(async (req, res) => {\n const url = new URL(req.url ?? '/', redirectUri)\n\n if (url.pathname === '/auth/callback') {\n const code = url.searchParams.get('code')\n const returnedState = url.searchParams.get('state')\n\n if (returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body>State mismatch. Please try again.</body></html>')\n rejectTokens(new Error('OAuth state mismatch'))\n return\n }\n\n if (!code) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body>Missing authorization code.</body></html>')\n rejectTokens(new Error('Missing authorization code'))\n return\n }\n\n try {\n const tokens = await codexExchangeCode(code, redirectUri, {\n verifier: pkce.verifier,\n })\n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(\n '<html><body>Authentication successful! You can close this tab.</body></html>',\n )\n resolveTokens(tokens)\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html' })\n res.end('<html><body>Token exchange failed.</body></html>')\n rejectTokens(\n err instanceof Error ? err : new Error('Token exchange failed'),\n )\n }\n } else {\n res.writeHead(404)\n res.end()\n }\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(port, listenHost, () => {\n server.off('error', reject)\n resolve()\n })\n })\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: CODEX_CLIENT_ID,\n redirect_uri: redirectUri,\n scope: CODEX_SCOPES,\n state,\n code_challenge: pkce.challenge,\n code_challenge_method: 'S256',\n })\n\n const authorizeUrl = `${CODEX_AUTH_BASE}/oauth/authorize?${params.toString()}`\n\n const cleanup = () => {\n server.close()\n }\n\n return { authorizeUrl, waitForCallback, cleanup }\n}\n\nexport function createCodexAuthFetch(\n getTokens: () => Promise<OAuthTokens>,\n onRefreshed: (tokens: OAuthTokens) => Promise<void>,\n): typeof globalThis.fetch {\n const authFetch = createAuthFetch({\n provider: 'openai-codex',\n getTokens,\n refreshTokens: codexRefreshTokens,\n onTokensRefreshed: onRefreshed,\n headerTransform: (headers, tokens) => {\n if (tokens.accountId) {\n headers.set('ChatGPT-Account-Id', tokens.accountId)\n }\n },\n urlTransform: (url) => {\n if (url.includes('/v1/responses') || url.includes('/chat/completions')) {\n return CODEX_API_URL\n }\n return url\n },\n })\n\n return async (input, init) => {\n const inputUrl = extractRequestUrl(input)\n let forceStream = false\n let body = init?.body\n\n if (isCodexRequestUrl(inputUrl) && body && typeof body === 'string') {\n try {\n const parsed = JSON.parse(body)\n if (!parsed.stream) {\n parsed.stream = true\n forceStream = true\n }\n if (parsed.text?.format?.strict) {\n parsed.text.format.strict = false\n }\n body = JSON.stringify(parsed)\n } catch {\n // Leave non-JSON request bodies unchanged.\n }\n }\n\n const response = await authFetch(input, { ...init, body })\n if (forceStream && response.ok && response.body) {\n return bufferCodexSSEResponse(response)\n }\n return response\n }\n}\n\nfunction extractRequestUrl(input: string | URL | Request): string {\n if (typeof input === 'string') return input\n if (input instanceof URL) return input.toString()\n return input.url\n}\n\nfunction isCodexRequestUrl(url: string): boolean {\n return url.includes('/v1/responses')\n || url.includes('/chat/completions')\n || url.includes('chatgpt.com/backend-api/codex')\n}\n\nasync function bufferCodexSSEResponse(response: Response): Promise<Response> {\n const reader = response.body!.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let completedResponse: JSONRecord | null = null\n let outputText = ''\n const pendingOutputItems = new Map<number, JSONRecord>()\n const completedOutputItems = new Map<number, JSONRecord>()\n const functionCallArgumentDeltas = new Map<number, string>()\n const customToolInputDeltas = new Map<number, string>()\n\n const overallTimeout = setTimeout(() => {\n try { reader.cancel() } catch { /* ignore */ }\n }, 120_000)\n\n try {\n while (true) {\n const chunkPromise = reader.read()\n const timeoutPromise = new Promise<{ done: true; value: undefined }>((resolve) =>\n setTimeout(() => resolve({ done: true, value: undefined }), 30_000)\n )\n const { done, value } = await Promise.race([chunkPromise, timeoutPromise])\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n try {\n const event = JSON.parse(data)\n if (!isJSONRecord(event) || typeof event.type !== 'string') continue\n\n if (event.type === 'response.output_text.delta' && typeof event.delta === 'string') {\n outputText += event.delta\n }\n\n if (event.type === 'response.output_item.added'\n && typeof event.output_index === 'number'\n && isJSONRecord(event.item)\n ) {\n pendingOutputItems.set(event.output_index, { ...event.item })\n }\n\n if (event.type === 'response.function_call_arguments.delta'\n && typeof event.output_index === 'number'\n && typeof event.delta === 'string'\n ) {\n const prev = functionCallArgumentDeltas.get(event.output_index) ?? ''\n functionCallArgumentDeltas.set(event.output_index, prev + event.delta)\n }\n\n if (event.type === 'response.custom_tool_call_input.delta'\n && typeof event.output_index === 'number'\n && typeof event.delta === 'string'\n ) {\n const prev = customToolInputDeltas.get(event.output_index) ?? ''\n customToolInputDeltas.set(event.output_index, prev + event.delta)\n }\n\n if (event.type === 'response.output_item.done'\n && typeof event.output_index === 'number'\n && isJSONRecord(event.item)\n ) {\n completedOutputItems.set(\n event.output_index,\n hydrateOutputItem(event.item, event.output_index, functionCallArgumentDeltas, customToolInputDeltas),\n )\n }\n\n if ((event.type === 'response.completed' || event.type === 'response.incomplete')\n && isJSONRecord(event.response)\n ) {\n completedResponse = event.response\n }\n } catch {\n // Ignore malformed SSE payloads.\n }\n }\n }\n } finally {\n clearTimeout(overallTimeout)\n }\n\n for (const [outputIndex, item] of pendingOutputItems) {\n if (!completedOutputItems.has(outputIndex)) {\n completedOutputItems.set(\n outputIndex,\n hydrateOutputItem(item, outputIndex, functionCallArgumentDeltas, customToolInputDeltas),\n )\n }\n }\n\n const bufferedOutput = [...completedOutputItems.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, item]) => item)\n\n const body = JSON.stringify(\n ensureResponseMetadata(\n completedResponse\n ? mergeBufferedOutputItems(completedResponse, bufferedOutput, outputText)\n : createBufferedResponse(bufferedOutput, outputText),\n ),\n )\n\n return new Response(body, {\n status: 200,\n headers: { 'content-type': 'application/json' },\n })\n}\n\nfunction isJSONRecord(value: unknown): value is JSONRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction hydrateOutputItem(\n item: JSONRecord,\n outputIndex: number,\n functionCallArgumentDeltas: Map<number, string>,\n customToolInputDeltas: Map<number, string>,\n): JSONRecord {\n const hydrated = { ...item }\n\n if (hydrated.type === 'function_call' && typeof hydrated.arguments !== 'string') {\n hydrated.arguments = functionCallArgumentDeltas.get(outputIndex) ?? ''\n }\n\n if (hydrated.type === 'custom_tool_call' && hydrated.input == null) {\n const input = customToolInputDeltas.get(outputIndex)\n if (input !== undefined) {\n hydrated.input = safeParseJSON(input) ?? input\n }\n }\n\n return hydrated\n}\n\nfunction mergeBufferedOutputItems(\n response: JSONRecord,\n bufferedOutput: JSONRecord[],\n outputText: string,\n): JSONRecord {\n const existingOutput = Array.isArray(response.output)\n ? response.output.filter(isJSONRecord)\n : []\n\n if (bufferedOutput.length === 0) {\n if (existingOutput.length > 0) return response\n return { ...response, output: [buildTextOutput(outputText)] }\n }\n\n const mergedOutput = [...existingOutput]\n const seenKeys = new Set(existingOutput.map(getOutputItemKey).filter((key): key is string => key !== null))\n\n for (const item of bufferedOutput) {\n const key = getOutputItemKey(item)\n if (key && seenKeys.has(key)) continue\n if (key) seenKeys.add(key)\n mergedOutput.push(item)\n }\n\n return { ...response, output: mergedOutput }\n}\n\nfunction createBufferedResponse(bufferedOutput: JSONRecord[], outputText: string): JSONRecord {\n return {\n id: 'codex-buffered',\n output: bufferedOutput.length > 0 ? bufferedOutput : [buildTextOutput(outputText)],\n status: 'completed',\n }\n}\n\nfunction ensureResponseMetadata(response: JSONRecord): JSONRecord {\n if (typeof response.created_at === 'number') return response\n\n return {\n ...response,\n created_at: Math.floor(Date.now() / 1000),\n }\n}\n\nfunction buildTextOutput(outputText: string): JSONRecord {\n return {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: outputText, annotations: [] }],\n }\n}\n\nfunction getOutputItemKey(item: JSONRecord): string | null {\n const type = typeof item.type === 'string' ? item.type : 'unknown'\n\n if (typeof item.id === 'string') return `${type}:${item.id}`\n if (typeof item.call_id === 'string') return `${type}:${item.call_id}`\n\n return null\n}\n\nfunction safeParseJSON(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n","import type { LLMAuthProviderPlugin } from '@vostride/agent-qa-core'\nimport { createAnthropicAuthFetch, exchangeAnthropicManualCode, startAnthropicAuth } from './anthropic.js'\nimport { codexBrowserAuth, createCodexAuthFetch } from './openai-codex.js'\n\nexport function createSubscriptionAuthPlugin(): { providers: LLMAuthProviderPlugin[] } {\n return {\n providers: [\n {\n providerId: 'openai-subscription',\n credentialProviderId: 'openai-subscription-oauth',\n label: 'OpenAI subscription',\n modelAdapter: 'openai-responses',\n dashboardAuth: { mode: 'browser-poll', buttonLabel: 'Login with OpenAI subscription' },\n async startAuth() {\n const result = await codexBrowserAuth()\n return {\n authorizeUrl: result.authorizeUrl,\n waitForTokens: result.waitForCallback,\n cleanup: result.cleanup,\n }\n },\n createAuthFetch({ getTokens, onRefreshed }) {\n return createCodexAuthFetch(getTokens, onRefreshed)\n },\n },\n {\n providerId: 'anthropic-subscription',\n credentialProviderId: 'anthropic-subscription',\n label: 'Anthropic subscription',\n modelAdapter: 'anthropic-messages',\n dashboardAuth: { mode: 'manual-code', buttonLabel: 'Login with Anthropic subscription' },\n async startAuth() {\n return startAnthropicAuth()\n },\n async exchangeCode(ctx) {\n return await exchangeAnthropicManualCode(ctx)\n },\n createAuthFetch({ getTokens, onRefreshed }) {\n return createAnthropicAuthFetch(getTokens, onRefreshed)\n },\n },\n ],\n }\n}\n\nexport default createSubscriptionAuthPlugin\n\nexport {\n ANTHROPIC_BETA_FLAGS,\n ANTHROPIC_CLIENT_ID,\n ANTHROPIC_REDIRECT_URI,\n ANTHROPIC_SCOPES,\n ANTHROPIC_TOKEN_URL,\n anthropicAuthorizeUrl,\n anthropicExchangeCode,\n anthropicRefreshTokens,\n createAnthropicAuthFetch,\n} from './anthropic.js'\n\nexport {\n CODEX_API_URL,\n CODEX_AUTH_BASE,\n CODEX_CLIENT_ID,\n CODEX_DEFAULT_PORT,\n CODEX_SCOPES,\n CODEX_TOKEN_URL,\n codexBrowserAuth,\n codexExchangeCode,\n codexRefreshTokens,\n createCodexAuthFetch,\n decodeJwtClaims,\n} from './openai-codex.js'\n"],"mappings":"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","names":["headers","generatePKCE"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vostride/agent-qa-subscription-auth",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Subscription LLM auth providers for agent-qa.",