openllmprovider 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -0
- package/dist/auth/index.cjs +6 -0
- package/dist/auth/index.d.cts +3 -0
- package/dist/auth/index.d.mts +3 -0
- package/dist/auth/index.mjs +3 -0
- package/dist/auto-C2hXJY13.d.cts +33 -0
- package/dist/auto-C2hXJY13.d.cts.map +1 -0
- package/dist/auto-CBqNYBXs.mjs +48 -0
- package/dist/auto-CBqNYBXs.mjs.map +1 -0
- package/dist/auto-CInerwvs.d.mts +33 -0
- package/dist/auto-CInerwvs.d.mts.map +1 -0
- package/dist/auto-D77wgMqO.cjs +59 -0
- package/dist/auto-D77wgMqO.cjs.map +1 -0
- package/dist/file-DB-rxfzi.mjs +77 -0
- package/dist/file-DB-rxfzi.mjs.map +1 -0
- package/dist/file-DZ7FGcSW.cjs +73 -0
- package/dist/file-DZ7FGcSW.cjs.map +1 -0
- package/dist/index.cjs +1909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1239 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +1241 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1891 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger-BsHpI_fH.mjs +11 -0
- package/dist/logger-BsHpI_fH.mjs.map +1 -0
- package/dist/logger-jRimlMFR.cjs +69 -0
- package/dist/logger-jRimlMFR.cjs.map +1 -0
- package/dist/plugin/index.cjs +29 -0
- package/dist/plugin/index.cjs.map +1 -0
- package/dist/plugin/index.d.cts +10 -0
- package/dist/plugin/index.d.cts.map +1 -0
- package/dist/plugin/index.d.mts +10 -0
- package/dist/plugin/index.d.mts.map +1 -0
- package/dist/plugin/index.mjs +25 -0
- package/dist/plugin/index.mjs.map +1 -0
- package/dist/plugin-BkeUu5LW.d.mts +46 -0
- package/dist/plugin-BkeUu5LW.d.mts.map +1 -0
- package/dist/plugin-wK7RmJhZ.d.cts +46 -0
- package/dist/plugin-wK7RmJhZ.d.cts.map +1 -0
- package/dist/resolver-BA7LWSJO.mjs +645 -0
- package/dist/resolver-BA7LWSJO.mjs.map +1 -0
- package/dist/resolver-BMTvzTt9.cjs +662 -0
- package/dist/resolver-BMTvzTt9.cjs.map +1 -0
- package/dist/resolver-MgJryMWG.d.cts +75 -0
- package/dist/resolver-MgJryMWG.d.cts.map +1 -0
- package/dist/resolver-_gfXzr_S.d.mts +76 -0
- package/dist/resolver-_gfXzr_S.d.mts.map +1 -0
- package/dist/storage/index.cjs +7 -0
- package/dist/storage/index.d.cts +12 -0
- package/dist/storage/index.d.cts.map +1 -0
- package/dist/storage/index.d.mts +12 -0
- package/dist/storage/index.d.mts.map +1 -0
- package/dist/storage/index.mjs +4 -0
- package/package.json +137 -0
- package/src/auth/.gitkeep +0 -0
- package/src/auth/index.ts +10 -0
- package/src/auth/resolver.ts +46 -0
- package/src/auth/scanners.ts +462 -0
- package/src/auth/store.ts +357 -0
- package/src/catalog/.gitkeep +0 -0
- package/src/catalog/catalog.ts +302 -0
- package/src/catalog/index.ts +17 -0
- package/src/catalog/mapper.ts +129 -0
- package/src/catalog/merger.ts +99 -0
- package/src/index.ts +37 -0
- package/src/logger.ts +7 -0
- package/src/plugin/.gitkeep +0 -0
- package/src/plugin/anthropic.test.ts +505 -0
- package/src/plugin/anthropic.ts +324 -0
- package/src/plugin/codex.ts +656 -0
- package/src/plugin/copilot.ts +161 -0
- package/src/plugin/google.ts +454 -0
- package/src/plugin/index.ts +30 -0
- package/src/provider/.gitkeep +0 -0
- package/src/provider/bundled.ts +59 -0
- package/src/provider/index.ts +249 -0
- package/src/provider/state.ts +163 -0
- package/src/storage/.gitkeep +0 -0
- package/src/storage/auto.ts +32 -0
- package/src/storage/file.ts +84 -0
- package/src/storage/index.ts +10 -0
- package/src/storage/memory.ts +23 -0
- package/src/types/.gitkeep +0 -0
- package/src/types/auth.ts +18 -0
- package/src/types/errors.ts +87 -0
- package/src/types/index.ts +26 -0
- package/src/types/model.ts +88 -0
- package/src/types/plugin.ts +49 -0
- package/src/types/provider.ts +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["log","log","CLIENT_ID","toBase64Url","createPkce","buildAuthorizationRequest","openUrlInBrowser","readCallbackInput","parseCallbackInput","exchangeAuthorizationCode","refreshAccessToken","log","toBase64Url","openUrlInBrowser","log","log","log","log"],"sources":["../src/catalog/mapper.ts","../src/catalog/merger.ts","../src/catalog/catalog.ts","../src/plugin/anthropic.ts","../src/plugin/codex.ts","../src/plugin/copilot.ts","../src/plugin/google.ts","../src/provider/bundled.ts","../src/provider/state.ts","../src/provider/index.ts"],"sourcesContent":["import { z } from 'zod'\nimport type { ModelDefinition } from '../types/model.js'\n\nconst ModelsDevModelSchema = z\n .object({\n id: z.string().optional(),\n name: z.string().optional(),\n family: z.string().optional(),\n\n reasoning: z.boolean().optional(),\n tool_call: z.boolean().optional(),\n structured_output: z.boolean().optional(),\n temperature: z.boolean().optional(),\n attachment: z.boolean().optional(),\n streaming: z.boolean().optional(),\n system_message: z.boolean().optional(),\n\n modalities: z\n .object({\n input: z.array(z.string()),\n output: z.array(z.string()),\n })\n .passthrough(),\n\n limit: z\n .object({\n context: z.number(),\n output: z.number(),\n input_images: z.number().optional(),\n })\n .passthrough(),\n\n cost: z\n .object({\n input: z.number(),\n output: z.number(),\n cache_read: z.number().optional(),\n cache_write: z.number().optional(),\n })\n .passthrough()\n .optional(),\n\n status: z.enum(['stable', 'beta', 'deprecated']).optional(),\n knowledge: z.string().optional(),\n })\n .passthrough()\n\nconst ModelsDevProviderSchema = z\n .object({\n id: z.string().optional(),\n name: z.string().optional(),\n env: z.array(z.string()).optional(),\n api: z.string().optional(),\n npm: z.string().optional(),\n doc: z.string().optional(),\n models: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n\nexport function mapModelsDevToModelDefinition(\n modelId: string,\n raw: unknown,\n provenance?: 'snapshot' | 'remote'\n): ModelDefinition | null {\n const parsed = ModelsDevModelSchema.safeParse(raw)\n if (!parsed.success) return null\n\n const { id: _id, knowledge, ...rest } = parsed.data\n\n const result: Record<string, unknown> = {\n ...rest,\n modelId,\n }\n\n if (knowledge !== undefined) {\n result.knowledgeCutoff = knowledge\n }\n\n if (provenance !== undefined) {\n result.provenance = provenance\n }\n\n return result as unknown as ModelDefinition\n}\n\nexport function mapModelsDevProvider(\n providerId: string,\n raw: unknown,\n provenance?: 'snapshot' | 'remote'\n): {\n provider: { id: string; name: string; env?: string[]; api?: string; doc?: string }\n models: ModelDefinition[]\n} {\n const parsed = ModelsDevProviderSchema.safeParse(raw)\n const name = parsed.success ? (parsed.data.name ?? providerId) : providerId\n const rawModels = parsed.success ? (parsed.data.models ?? {}) : {}\n\n const models: ModelDefinition[] = []\n for (const [modelId, modelRaw] of Object.entries(rawModels)) {\n const mapped = mapModelsDevToModelDefinition(modelId, modelRaw, provenance)\n if (mapped) models.push(mapped)\n }\n\n return {\n provider: {\n id: providerId,\n name,\n ...(parsed.success && parsed.data.env !== undefined ? { env: parsed.data.env } : {}),\n ...(parsed.success && parsed.data.api !== undefined ? { api: parsed.data.api } : {}),\n ...(parsed.success && parsed.data.doc !== undefined ? { doc: parsed.data.doc } : {}),\n },\n models,\n }\n}\n\nexport function mapModelsDevProviderMetadata(\n providerId: string,\n raw: unknown\n): { id: string; name: string; env?: string[]; api?: string; doc?: string } {\n const parsed = ModelsDevProviderSchema.safeParse(raw)\n\n return {\n id: providerId,\n name: parsed.success ? (parsed.data.name ?? providerId) : providerId,\n ...(parsed.success && parsed.data.env !== undefined ? { env: parsed.data.env } : {}),\n ...(parsed.success && parsed.data.api !== undefined ? { api: parsed.data.api } : {}),\n ...(parsed.success && parsed.data.doc !== undefined ? { doc: parsed.data.doc } : {}),\n }\n}\n","import type { ModelDefinition } from '../types/model.js'\n\ntype NestedObject = Record<string, unknown>\n\nconst FIELD_LEVEL_MERGE_KEYS: ReadonlySet<string> = new Set(['limit', 'cost'])\nconst REPLACE_KEYS: ReadonlySet<string> = new Set(['modalities'])\n\nfunction mergeNestedObject(\n base: NestedObject | undefined,\n overlay: NestedObject | undefined\n): NestedObject | undefined {\n if (!overlay) return base ? { ...base } : undefined\n if (!base) return { ...overlay }\n const result = { ...base }\n for (const key of Object.keys(overlay)) {\n if (overlay[key] !== undefined) {\n result[key] = overlay[key]\n }\n }\n return result\n}\n\nexport function mergeModelDefinitions(base: ModelDefinition, overlay: Partial<ModelDefinition>): ModelDefinition {\n const result = { ...base }\n\n for (const key of Object.keys(overlay) as Array<keyof ModelDefinition>) {\n if (key === 'modelId') continue\n\n const overlayValue = overlay[key]\n if (overlayValue === undefined) continue\n\n if (FIELD_LEVEL_MERGE_KEYS.has(key)) {\n const merged = mergeNestedObject(base[key] as NestedObject | undefined, overlayValue as NestedObject)\n if (merged !== undefined) {\n ;(result as Record<string, unknown>)[key] = merged\n }\n continue\n }\n\n if (REPLACE_KEYS.has(key)) {\n ;(result as Record<string, unknown>)[key] = overlayValue\n continue\n }\n ;(result as Record<string, unknown>)[key] = overlayValue\n }\n\n return result\n}\n\nexport function mergeCatalogData(\n snapshot: Map<string, ModelDefinition>,\n remote: Map<string, ModelDefinition>,\n overrides: Map<string, Partial<ModelDefinition>>\n): Map<string, ModelDefinition> {\n const allModelIds = new Set([...snapshot.keys(), ...remote.keys()])\n const result = new Map<string, ModelDefinition>()\n\n for (const modelId of allModelIds) {\n const snap = snapshot.get(modelId)\n const rem = remote.get(modelId)\n const override = overrides.get(modelId)\n\n const inSnapshot = snap !== undefined\n const inRemote = rem !== undefined\n const hasOverride = override !== undefined\n\n let merged: ModelDefinition\n\n if (inSnapshot && inRemote) {\n merged = mergeModelDefinitions(snap, rem)\n } else if (inRemote) {\n merged = { ...rem }\n } else if (snap) {\n merged = { ...snap }\n } else {\n continue\n }\n\n if (hasOverride) {\n merged = mergeModelDefinitions(merged, override)\n }\n\n if (hasOverride) {\n merged.provenance = 'user-override'\n } else if (inRemote) {\n merged.provenance = 'remote'\n } else {\n merged.provenance = 'snapshot'\n }\n\n if (inSnapshot && !inRemote) {\n merged.status = 'deprecated'\n }\n\n result.set(modelId, merged)\n }\n\n return result\n}\n","import { createLogger } from '../logger.js'\nimport type { ModelDefinition } from '../types/model.js'\nimport { mapModelsDevProvider, mapModelsDevProviderMetadata } from './mapper.js'\nimport { mergeCatalogData, mergeModelDefinitions } from './merger.js'\n\nconst DEFAULT_REMOTE_URL = 'https://models.dev/api.json'\nconst DEFAULT_TIMEOUT_MS = 10_000\n\nconst log = createLogger('catalog')\n\ntype CatalogDataSource = Record<string, unknown>\ntype ProviderModelMap = Map<string, Map<string, ModelDefinition>>\ntype FetchLike = (\n url: string,\n init?: { signal?: unknown }\n) => Promise<{ ok: boolean; status: number; json(): Promise<unknown> }>\n\nexport interface CatalogProvider {\n id: string\n name: string\n env?: string[]\n api?: string\n doc?: string\n bundledProvider?: string\n baseURL?: string\n headers?: Record<string, string>\n options?: Record<string, unknown>\n}\n\nexport interface ExtendModelConfig {\n name?: string\n modalities?: {\n input: Array<'text' | 'image' | 'audio' | 'video' | 'pdf'>\n output: Array<'text' | 'image' | 'audio'>\n }\n limit?: { context: number; output: number }\n}\n\nexport interface ExtendProviderConfig {\n name: string\n env?: string[]\n bundledProvider?: string\n baseURL?: string\n headers?: Record<string, string>\n options?: Record<string, unknown>\n models?: Record<string, ExtendModelConfig>\n}\n\nexport interface ExtendConfig {\n providers?: Record<string, ExtendProviderConfig>\n}\n\nexport interface CatalogOptions {\n snapshot?: Record<string, unknown>\n remote?: {\n url?: string\n timeoutMs?: number\n fetch?: FetchLike\n }\n}\n\nexport interface RefreshResult {\n success: boolean\n updatedProviders: string[]\n newModels: number\n error?: Error\n}\n\nexport class Catalog {\n private readonly remoteOptions: {\n readonly url: string\n readonly timeoutMs: number\n readonly fetch?: FetchLike\n }\n\n private readonly snapshotData: CatalogDataSource\n private remoteData: CatalogDataSource = {}\n private readonly providers = new Map<string, CatalogProvider>()\n private modelsByProvider: ProviderModelMap = new Map()\n private refreshInFlight: Promise<RefreshResult> | null = null\n private readonly extendedProviders = new Map<string, CatalogProvider>()\n private readonly extendedModels = new Map<string, Map<string, Partial<ModelDefinition>>>()\n\n constructor(options: CatalogOptions = {}) {\n this.snapshotData = options.snapshot ?? {}\n this.remoteOptions = {\n url: options.remote?.url ?? DEFAULT_REMOTE_URL,\n timeoutMs: options.remote?.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n fetch: options.remote?.fetch,\n }\n this.applyProviderMetadata(this.snapshotData, {})\n log('initialized with %d providers from snapshot', this.providers.size)\n }\n\n getProvider(id: string): CatalogProvider | undefined {\n return this.providers.get(id)\n }\n\n listProviders(): CatalogProvider[] {\n return [...this.providers.values()]\n }\n\n getModel(providerId: string, modelId: string): ModelDefinition | undefined {\n this.ensureProviderModelsLoaded(providerId)\n return this.modelsByProvider.get(providerId)?.get(modelId)\n }\n\n listModels(providerId?: string): ModelDefinition[] {\n if (providerId !== undefined) {\n this.ensureProviderModelsLoaded(providerId)\n return [...(this.modelsByProvider.get(providerId)?.values() ?? [])]\n }\n\n const results: ModelDefinition[] = []\n for (const pid of this.providers.keys()) {\n this.ensureProviderModelsLoaded(pid)\n const models = this.modelsByProvider.get(pid)\n if (models) {\n results.push(...models.values())\n }\n }\n return results\n }\n\n enrichModel(providerId: string, modelId: string, partial: Partial<ModelDefinition>): ModelDefinition {\n const catalogModel = this.getModel(providerId, modelId)\n const partialWithId = { ...partial, modelId }\n if (!catalogModel) {\n return partialWithId as ModelDefinition\n }\n return mergeModelDefinitions(catalogModel, partialWithId)\n }\n\n extend(config: ExtendConfig): void {\n if (!config.providers) return\n\n for (const [providerId, providerConfig] of Object.entries(config.providers)) {\n const existingProvider = this.providers.get(providerId)\n const provider: CatalogProvider = {\n id: providerId,\n name: providerConfig.name,\n ...(providerConfig.env !== undefined ? { env: providerConfig.env } : {}),\n ...(existingProvider?.api !== undefined ? { api: existingProvider.api } : {}),\n ...(existingProvider?.doc !== undefined ? { doc: existingProvider.doc } : {}),\n ...(providerConfig.bundledProvider !== undefined ? { bundledProvider: providerConfig.bundledProvider } : {}),\n ...(providerConfig.baseURL !== undefined ? { baseURL: providerConfig.baseURL } : {}),\n ...(providerConfig.headers !== undefined ? { headers: providerConfig.headers } : {}),\n ...(providerConfig.options !== undefined ? { options: providerConfig.options } : {}),\n }\n\n this.extendedProviders.set(providerId, provider)\n this.providers.set(providerId, provider)\n\n if (providerConfig.models) {\n const modelOverrides = this.extendedModels.get(providerId) ?? new Map<string, Partial<ModelDefinition>>()\n\n for (const [modelId, modelConfig] of Object.entries(providerConfig.models)) {\n const partial: Partial<ModelDefinition> = { modelId }\n if (modelConfig.name !== undefined) partial.name = modelConfig.name\n if (modelConfig.modalities !== undefined) partial.modalities = modelConfig.modalities\n if (modelConfig.limit !== undefined) partial.limit = modelConfig.limit\n modelOverrides.set(modelId, partial)\n }\n\n this.extendedModels.set(providerId, modelOverrides)\n }\n\n this.modelsByProvider.delete(providerId)\n }\n }\n\n refresh(): Promise<RefreshResult> {\n if (this.refreshInFlight) {\n return this.refreshInFlight\n }\n\n const task = this.refreshInternal().finally(() => {\n this.refreshInFlight = null\n })\n\n this.refreshInFlight = task\n return task\n }\n\n private async refreshInternal(): Promise<RefreshResult> {\n try {\n log('refresh: fetching from %s', this.remoteOptions.url)\n const remoteData = await this.fetchRemoteData()\n this.remoteData = remoteData\n const { updatedProviders } = this.applyProviderMetadata(this.snapshotData, this.remoteData)\n this.modelsByProvider.clear()\n log('refresh: updated %d providers', updatedProviders.length)\n return { success: true, updatedProviders, newModels: 0 }\n } catch (error) {\n log('refresh: failed — %s', error instanceof Error ? error.message : String(error))\n return {\n success: false,\n updatedProviders: [],\n newModels: 0,\n error: error instanceof Error ? error : new Error(String(error)),\n }\n }\n }\n\n private async fetchRemoteData(): Promise<CatalogDataSource> {\n const fetchFn = this.remoteOptions.fetch ?? this.resolveGlobalFetch()\n if (!fetchFn) throw new Error('No fetch implementation available')\n\n const response = await fetchFn(this.remoteOptions.url)\n if (!response.ok) throw new Error(`Failed to fetch remote catalog: HTTP ${response.status}`)\n\n const payload = await response.json()\n if (payload && typeof payload === 'object') return payload as CatalogDataSource\n throw new Error('Invalid remote catalog payload')\n }\n\n private resolveGlobalFetch(): FetchLike | undefined {\n const maybeFetch = (globalThis as Record<string, unknown>).fetch\n return typeof maybeFetch === 'function' ? (maybeFetch as FetchLike) : undefined\n }\n\n private applyProviderMetadata(\n snapshotRaw: CatalogDataSource,\n remoteRaw: CatalogDataSource\n ): { updatedProviders: string[] } {\n const snapshotProviders = this.mapProviderMetadata(snapshotRaw)\n const remoteProviders = this.mapProviderMetadata(remoteRaw)\n const allProviderIds = new Set<string>([...snapshotProviders.keys(), ...remoteProviders.keys()])\n\n this.providers.clear()\n for (const providerId of allProviderIds) {\n const provider = remoteProviders.get(providerId) ?? snapshotProviders.get(providerId)\n if (provider) this.providers.set(providerId, provider)\n }\n\n for (const [providerId, provider] of this.extendedProviders.entries()) {\n this.providers.set(providerId, provider)\n }\n\n return { updatedProviders: [...remoteProviders.keys()] }\n }\n\n private mapProviderMetadata(data: CatalogDataSource): Map<string, CatalogProvider> {\n const result = new Map<string, CatalogProvider>()\n for (const [providerId, rawProvider] of Object.entries(data)) {\n if (providerId.startsWith('_')) continue\n result.set(providerId, mapModelsDevProviderMetadata(providerId, rawProvider))\n }\n return result\n }\n\n private providerRaw(data: CatalogDataSource, providerId: string): unknown {\n const value = data[providerId]\n return value && typeof value === 'object' ? value : undefined\n }\n\n private mapProviderModelsFromRaw(\n providerId: string,\n raw: unknown,\n provenance: 'snapshot' | 'remote'\n ): Map<string, ModelDefinition> {\n if (!raw || typeof raw !== 'object') return new Map<string, ModelDefinition>()\n const mapped = mapModelsDevProvider(providerId, raw, provenance)\n const byId = new Map<string, ModelDefinition>()\n for (const model of mapped.models) {\n byId.set(model.modelId, model)\n }\n return byId\n }\n\n private ensureProviderModelsLoaded(providerId: string): void {\n if (this.modelsByProvider.has(providerId)) return\n\n const snapshotModels = this.mapProviderModelsFromRaw(\n providerId,\n this.providerRaw(this.snapshotData, providerId),\n 'snapshot'\n )\n const remoteModels = this.mapProviderModelsFromRaw(\n providerId,\n this.providerRaw(this.remoteData, providerId),\n 'remote'\n )\n const extendedOverrides = this.extendedModels.get(providerId) ?? new Map<string, Partial<ModelDefinition>>()\n\n const merged = mergeCatalogData(snapshotModels, remoteModels, extendedOverrides)\n\n for (const [modelId, partial] of extendedOverrides.entries()) {\n if (!merged.has(modelId)) {\n const base: ModelDefinition = {\n modelId,\n modalities: { input: ['text'], output: ['text'] },\n limit: { context: 0, output: 0 },\n provenance: 'user-override',\n }\n merged.set(modelId, mergeModelDefinitions(base, partial))\n }\n }\n\n this.modelsByProvider.set(providerId, merged)\n }\n}\n","import { spawn } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook } from '../types/plugin.js'\n\nconst log = createLogger('plugin:anthropic')\n\nconst CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e'\nconst AUTHORIZE_URL = 'https://claude.ai/oauth/authorize'\nconst TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token'\nconst API_KEY_EXCHANGE_URL = 'https://api.anthropic.com/api/oauth/claude_cli/create_api_key'\nconst REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback'\nconst OAUTH_SCOPES = 'org:create_api_key user:profile user:inference'\nconst OAUTH_BETA = 'oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14'\n\ninterface TokenResponse {\n access_token: string\n refresh_token?: string\n expires_in?: number\n}\n\ninterface CreateApiKeyResponse {\n raw_key?: string\n}\n\nfunction isOAuthToken(value: string): boolean {\n return value.startsWith('sk-ant-oat') || value.startsWith('sk-ant-ort')\n}\n\nfunction looksLikeApiKey(value: string): boolean {\n if (isOAuthToken(value)) return false\n return value.startsWith('sk-ant-')\n}\n\nfunction applyBearerHeaders(headers: Headers, token: string): void {\n headers.delete('x-api-key')\n headers.delete('authorization')\n headers.delete('Authorization')\n headers.set('Authorization', `Bearer ${token}`)\n headers.set('anthropic-beta', OAUTH_BETA)\n}\n\nfunction toBase64Url(inputValue: Buffer): string {\n return inputValue.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nfunction createPkce(): { verifier: string; challenge: string } {\n const verifier = toBase64Url(randomBytes(32))\n const challenge = toBase64Url(createHash('sha256').update(verifier).digest())\n return { verifier, challenge }\n}\n\nfunction buildAuthorizationRequest(): { url: string; verifier: string; state: string } {\n const { verifier, challenge } = createPkce()\n const state = verifier\n const url = new URL(AUTHORIZE_URL)\n url.searchParams.set('code', 'true')\n url.searchParams.set('client_id', CLIENT_ID)\n url.searchParams.set('response_type', 'code')\n url.searchParams.set('redirect_uri', REDIRECT_URI)\n url.searchParams.set('scope', OAUTH_SCOPES)\n url.searchParams.set('code_challenge', challenge)\n url.searchParams.set('code_challenge_method', 'S256')\n url.searchParams.set('state', state)\n return { url: url.toString(), verifier, state }\n}\n\nfunction openUrlInBrowser(url: string): void {\n const platform = process.platform\n const command = platform === 'darwin' ? 'open' : platform === 'win32' ? 'rundll32' : 'xdg-open'\n const args = platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url]\n try {\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.unref()\n } catch {\n log('failed to open browser automatically')\n }\n}\n\nasync function readCallbackInput(question: string): Promise<string> {\n const rl = createInterface({ input, output })\n try {\n return (await rl.question(question)).trim()\n } finally {\n rl.close()\n }\n}\n\nfunction parseCallbackInput(value: string): { code?: string; state?: string } {\n const raw = value.trim()\n if (raw.length === 0) return {}\n\n if (/^https?:\\/\\//i.test(raw)) {\n try {\n const u = new URL(raw)\n return {\n code: u.searchParams.get('code') ?? undefined,\n state: u.searchParams.get('state') ?? undefined,\n }\n } catch {\n return {}\n }\n }\n\n const maybeQuery = raw.startsWith('?') ? raw.slice(1) : raw\n if (maybeQuery.includes('=')) {\n const params = new URLSearchParams(maybeQuery)\n const code = params.get('code') ?? undefined\n const state = params.get('state') ?? undefined\n if (code !== undefined || state !== undefined) return { code, state }\n }\n\n return { code: raw }\n}\n\nasync function exchangeAuthorizationCode(code: string, verifier: string, state: string): Promise<TokenResponse> {\n const res = await globalThis.fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code,\n state,\n client_id: CLIENT_ID,\n redirect_uri: REDIRECT_URI,\n code_verifier: verifier,\n }),\n })\n\n if (!res.ok) {\n const body = await res.text()\n throw new Error(`Anthropic token exchange failed: ${res.status} ${res.statusText} ${body}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return {\n access_token: String(raw.access_token ?? ''),\n refresh_token: typeof raw.refresh_token === 'string' ? raw.refresh_token : undefined,\n expires_in: typeof raw.expires_in === 'number' ? raw.expires_in : undefined,\n }\n}\n\nasync function refreshAccessToken(refreshToken: string): Promise<TokenResponse> {\n const res = await globalThis.fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n })\n\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n throw new Error(`Anthropic token refresh failed: ${res.status} ${res.statusText} ${body}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return {\n access_token: String(raw.access_token ?? ''),\n refresh_token: typeof raw.refresh_token === 'string' ? raw.refresh_token : undefined,\n expires_in: typeof raw.expires_in === 'number' ? raw.expires_in : undefined,\n }\n}\n\nasync function createApiKeyFromOAuthAccessToken(accessToken: string): Promise<string> {\n const res = await globalThis.fetch(API_KEY_EXCHANGE_URL, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: '{}',\n })\n\n if (!res.ok) {\n const body = await res.text()\n throw new Error(`Anthropic API key exchange failed: ${res.status} ${res.statusText} ${body}`)\n }\n\n const raw = (await res.json()) as CreateApiKeyResponse\n if (typeof raw.raw_key !== 'string' || raw.raw_key.length === 0) {\n throw new Error('Anthropic API key exchange returned empty raw_key')\n }\n\n return raw.raw_key\n}\n\n/**\n * Resolve a fresh OAuth access_token from the credential, refreshing if expired.\n * Used both during loader setup and inside the per-request Bearer fallback fetch.\n * When a refresh occurs and setAuth is provided, the updated credential is persisted.\n */\nasync function resolveOAuthToken(\n auth: AuthCredential,\n setAuth?: (credential: AuthCredential) => Promise<void>,\n): Promise<string | undefined> {\n let token = auth.key\n if (auth.expires !== undefined && auth.expires < Date.now() && typeof auth.refresh === 'string') {\n try {\n const refreshed = await refreshAccessToken(auth.refresh)\n token = refreshed.access_token\n if (setAuth) {\n const updated: AuthCredential = {\n ...auth,\n key: refreshed.access_token,\n refresh: refreshed.refresh_token ?? auth.refresh,\n expires: refreshed.expires_in !== undefined ? Date.now() + refreshed.expires_in * 1000 : undefined,\n }\n await setAuth(updated).catch((err) =>\n log('failed to persist refreshed credential: %s', err instanceof Error ? err.message : String(err)),\n )\n }\n } catch (error) {\n log('anthropic token refresh failed: %s', error instanceof Error ? error.message : String(error))\n }\n }\n return typeof token === 'string' && token.length > 0 ? token : undefined\n}\n\n// ---------------------------------------------------------------------------\n// Anthropic auth supports two modes:\n//\n// 1. API key (type: 'api')\n// - key holds a direct API key (sk-ant-api03-xxx)\n// - The loader returns {} — no custom config needed, the SDK uses x-api-key\n// header automatically.\n//\n// 2. OAuth (type: 'oauth')\n// - key holds the short-lived access_token (sk-ant-oat-xxx)\n// - refresh holds the long-lived refresh_token (sk-ant-ort-xxx)\n// - expires is the absolute timestamp (ms) when the access_token expires\n// - The loader handles the full lifecycle:\n// a. If the access_token is expired and a refresh_token exists, refresh it\n// b. If the token looks like an API key (sk-ant- but not oat/ort), use as apiKey\n// c. Otherwise, exchange the OAuth access_token for an API key via\n// /api/oauth/claude_cli/create_api_key\n// d. If exchange fails, fall back to Bearer token auth with custom fetch\n// ---------------------------------------------------------------------------\nexport const anthropicPlugin: AuthHook = {\n provider: 'anthropic',\n\n // API key auth: loader is a no-op — the SDK handles x-api-key header directly\n async loader(getAuth, _provider, setAuth) {\n const auth = await getAuth()\n if (auth.type !== 'oauth') return {}\n\n // OAuth: resolve a fresh token (refresh if expired), then try apiKey paths\n const token = await resolveOAuthToken(auth, setAuth)\n\n if (token !== undefined) {\n if (looksLikeApiKey(token)) {\n return { apiKey: token }\n }\n\n try {\n const apiKey = await createApiKeyFromOAuthAccessToken(token)\n return { apiKey }\n } catch (error) {\n log('anthropic api key exchange failed, using oauth bearer fallback: %s', String(error))\n }\n }\n\n // Bearer fallback: per-request token refresh (same pattern as google/codex plugins)\n return {\n headers: {\n 'anthropic-beta': OAUTH_BETA,\n },\n async fetch(request: Parameters<typeof globalThis.fetch>[0], init?: Parameters<typeof globalThis.fetch>[1]) {\n const currentAuth = await getAuth()\n const bearerToken = await resolveOAuthToken(currentAuth, setAuth)\n const headers = new Headers(init?.headers)\n applyBearerHeaders(headers, bearerToken ?? '')\n return globalThis.fetch(request, { ...init, headers })\n },\n }\n },\n\n methods: [\n {\n type: 'oauth',\n label: 'Claude Pro/Max (Browser OAuth)',\n async handler(): Promise<AuthCredential> {\n const authRequest = buildAuthorizationRequest()\n console.log('Open this URL to continue Claude Pro/Max OAuth:')\n console.log(authRequest.url)\n openUrlInBrowser(authRequest.url)\n\n const callbackInput = await readCallbackInput('Paste the callback URL or authorization code: ')\n const parsed = parseCallbackInput(callbackInput)\n if (!parsed.code) throw new Error('Missing authorization code in callback input')\n if (parsed.state !== undefined && parsed.state !== authRequest.state) {\n throw new Error('OAuth state mismatch')\n }\n\n const tokens = await exchangeAuthorizationCode(parsed.code, authRequest.verifier, authRequest.state)\n return {\n type: 'oauth',\n key: tokens.access_token,\n refresh: tokens.refresh_token,\n expires: tokens.expires_in !== undefined ? Date.now() + tokens.expires_in * 1000 : undefined,\n }\n },\n },\n ],\n}\n","import { spawn } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { createServer } from 'node:http'\nimport { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook, AuthMethod, ProviderInfo } from '../types/plugin.js'\n\nconst log = createLogger('plugin:codex')\n\nconst OAUTH_DUMMY_KEY = 'codex-oauth-placeholder'\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\nconst ISSUER = 'https://auth.openai.com'\nconst OPENAI_AUTHORIZE_URL = `${ISSUER}/oauth/authorize`\nconst OPENAI_TOKEN_URL = `${ISSUER}/oauth/token`\nconst OPENAI_DEVICE_USERCODE_URL = `${ISSUER}/api/accounts/deviceauth/usercode`\nconst OPENAI_DEVICE_TOKEN_URL = `${ISSUER}/api/accounts/deviceauth/token`\nconst OPENAI_DEVICE_VERIFY_URL = `${ISSUER}/codex/device`\nconst CODEX_API_ENDPOINT = 'https://chatgpt.com/backend-api/codex/responses'\nconst DEVICE_USER_AGENT = 'openllmprovider/codex-auth'\nconst OAUTH_CALLBACK_PORT = 1455\nconst OAUTH_CALLBACK_PATH = '/auth/callback'\nconst OAUTH_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000\n\ninterface TokenResponse {\n access_token: string\n refresh_token?: string\n expires_in: number\n token_type: string\n}\n\nfunction parseTokenResponse(raw: Record<string, unknown>): TokenResponse {\n return {\n access_token: String(raw.access_token ?? ''),\n refresh_token: typeof raw.refresh_token === 'string' ? raw.refresh_token : undefined,\n expires_in: Number(raw.expires_in ?? 3600),\n token_type: String(raw.token_type ?? 'Bearer'),\n }\n}\n\n/**\n * Decode a JWT payload (base64url) and return claims as a plain object.\n * Returns undefined if the token is not a valid JWT.\n */\nfunction decodeJwtPayload(token: string): Record<string, unknown> | undefined {\n const parts = token.split('.')\n if (parts.length !== 3) return undefined\n try {\n const payload = parts[1]\n // base64url → base64 → decode\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64 + '==='.slice((base64.length + 3) % 4)\n const decoded = atob(padded)\n const parsed: unknown = JSON.parse(decoded)\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n } catch {\n // malformed JWT — ignore\n }\n return undefined\n}\n\n/**\n * Extract the ChatGPT account ID from an OpenAI OAuth JWT access token.\n * The claim is nested: token[\"https://api.openai.com/auth\"][\"chatgpt_account_id\"]\n */\nfunction extractAccountIdFromJwt(token: string): string | undefined {\n const claims = decodeJwtPayload(token)\n if (claims === undefined) return undefined\n const authClaim = claims['https://api.openai.com/auth']\n if (authClaim !== null && typeof authClaim === 'object' && !Array.isArray(authClaim)) {\n const id = (authClaim as Record<string, unknown>).chatgpt_account_id\n if (typeof id === 'string' && id.length > 0) return id\n }\n return undefined\n}\n\ninterface DeviceAuthStartResponse {\n device_auth_id: string\n user_code: string\n interval?: string | number\n}\n\ninterface DeviceAuthTokenResponse {\n authorization_code: string\n code_verifier: string\n}\n\ninterface BrowserOauthStart {\n authorizationUrl: string\n callbackPromise: Promise<{ code: string; state?: string }>\n expectedState: string\n codeVerifier: string\n stop: () => Promise<void>\n}\n\nfunction toBase64Url(input: Buffer): string {\n return input.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nfunction createPkcePair(): { verifier: string; challenge: string } {\n const verifier = toBase64Url(randomBytes(32))\n const challenge = toBase64Url(createHash('sha256').update(verifier).digest())\n return { verifier, challenge }\n}\n\nfunction openUrlInBrowser(url: string): void {\n const platform = process.platform\n const command = platform === 'darwin' ? 'open' : platform === 'win32' ? 'rundll32' : 'xdg-open'\n const args = platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url]\n try {\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.unref()\n } catch {\n log('failed to open browser automatically')\n }\n}\n\nasync function startBrowserOAuthFlow(): Promise<BrowserOauthStart> {\n const { verifier, challenge } = createPkcePair()\n const state = toBase64Url(randomBytes(24))\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}`\n\n const authUrl = new URL(OPENAI_AUTHORIZE_URL)\n authUrl.searchParams.set('response_type', 'code')\n authUrl.searchParams.set('client_id', CLIENT_ID)\n authUrl.searchParams.set('redirect_uri', redirectUri)\n authUrl.searchParams.set('scope', 'openid profile email offline_access')\n authUrl.searchParams.set('code_challenge', challenge)\n authUrl.searchParams.set('code_challenge_method', 'S256')\n authUrl.searchParams.set('state', state)\n authUrl.searchParams.set('id_token_add_organizations', 'true')\n authUrl.searchParams.set('codex_cli_simplified_flow', 'true')\n authUrl.searchParams.set('originator', 'openllmprovider')\n\n const successPage =\n '<!doctype html><html><body style=\"font-family:system-ui;padding:24px\">Authentication complete. You can close this tab.</body></html>'\n const errorPage =\n '<!doctype html><html><body style=\"font-family:system-ui;padding:24px\">Authentication failed. Return to terminal.</body></html>'\n\n let resolved = false\n let rejectAuth: (reason?: unknown) => void = () => {}\n let closeServer: () => Promise<void> = async () => {}\n\n const callbackPromise = new Promise<{ code: string; state?: string }>((resolve, reject) => {\n rejectAuth = reject\n const server = createServer((req, res) => {\n if (!req.url) {\n res.statusCode = 400\n res.end(errorPage)\n if (!resolved) {\n resolved = true\n reject(new Error('OAuth callback request missing URL'))\n }\n return\n }\n\n const callbackUrl = new URL(req.url, `http://localhost:${OAUTH_CALLBACK_PORT}`)\n if (callbackUrl.pathname !== OAUTH_CALLBACK_PATH) {\n res.statusCode = 404\n res.end('Not Found')\n return\n }\n\n const error = callbackUrl.searchParams.get('error')\n const errorDescription = callbackUrl.searchParams.get('error_description')\n const code = callbackUrl.searchParams.get('code') ?? undefined\n const responseState = callbackUrl.searchParams.get('state') ?? undefined\n\n if (error) {\n res.statusCode = 400\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(errorPage)\n if (!resolved) {\n resolved = true\n reject(new Error(errorDescription ?? error))\n }\n return\n }\n\n if (!code) {\n res.statusCode = 400\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(errorPage)\n if (!resolved) {\n resolved = true\n reject(new Error('OAuth callback missing code'))\n }\n return\n }\n\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(successPage)\n if (!resolved) {\n resolved = true\n resolve({ code, state: responseState })\n }\n })\n\n server.once('error', (error) => {\n if (!resolved) {\n resolved = true\n reject(error)\n }\n })\n\n server.listen(OAUTH_CALLBACK_PORT, '127.0.0.1')\n\n closeServer = async () => {\n await new Promise<void>((closeResolve) => {\n server.close(() => closeResolve())\n })\n }\n })\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true\n rejectAuth(new Error('Browser OAuth timed out waiting for callback'))\n }\n }, OAUTH_CALLBACK_TIMEOUT_MS)\n\n const stop = async (): Promise<void> => {\n clearTimeout(timeout)\n await closeServer()\n }\n\n return {\n authorizationUrl: authUrl.toString(),\n callbackPromise,\n expectedState: state,\n codeVerifier: verifier,\n stop,\n }\n}\n\nfunction extractApiErrorMessage(rawBody: string): string {\n try {\n const parsed = JSON.parse(rawBody) as Record<string, unknown>\n const direct = parsed.message\n if (typeof direct === 'string' && direct.length > 0) {\n return direct\n }\n const nested = parsed.error\n if (nested !== null && typeof nested === 'object' && !Array.isArray(nested)) {\n const msg = (nested as Record<string, unknown>).message\n if (typeof msg === 'string' && msg.length > 0) {\n return msg\n }\n }\n } catch {\n return rawBody\n }\n return rawBody\n}\n\nfunction isDeviceAuthSecurityGate(message: string): boolean {\n const text = message.toLowerCase()\n return (\n text.includes('enable device code authorization for codex') ||\n text.includes('chatgpt security settings') ||\n text.includes('device code authorization')\n )\n}\n\nasync function startDeviceAuth(): Promise<DeviceAuthStartResponse> {\n const res = await globalThis.fetch(OPENAI_DEVICE_USERCODE_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': DEVICE_USER_AGENT,\n },\n body: JSON.stringify({ client_id: CLIENT_ID }),\n })\n\n if (!res.ok) {\n const body = await res.text()\n throw new Error(`Device auth start failed: ${res.status} ${res.statusText} ${body}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return {\n device_auth_id: String(raw.device_auth_id ?? ''),\n user_code: String(raw.user_code ?? ''),\n interval: typeof raw.interval === 'string' || typeof raw.interval === 'number' ? raw.interval : undefined,\n }\n}\n\nasync function pollDeviceAuthorizationCode(\n deviceAuthId: string,\n userCode: string,\n intervalSeconds: number\n): Promise<DeviceAuthTokenResponse> {\n const intervalMs = Math.max(intervalSeconds, 1) * 1000\n const maxPolls = 120\n\n for (let i = 0; i < maxPolls; i++) {\n await new Promise<void>((resolve) => setTimeout(resolve, intervalMs + 3000))\n\n const res = await globalThis.fetch(OPENAI_DEVICE_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': DEVICE_USER_AGENT,\n },\n body: JSON.stringify({\n device_auth_id: deviceAuthId,\n user_code: userCode,\n }),\n })\n\n if (res.ok) {\n const raw = (await res.json()) as Record<string, unknown>\n const authorizationCode = String(raw.authorization_code ?? '')\n const codeVerifier = String(raw.code_verifier ?? '')\n if (!authorizationCode || !codeVerifier) {\n throw new Error('Device auth token response missing authorization_code/code_verifier')\n }\n log('poll[%d]: authorization code acquired', i + 1)\n return { authorization_code: authorizationCode, code_verifier: codeVerifier }\n }\n\n if (res.status === 403 || res.status === 404) {\n if (res.status === 403) {\n const body = await res.text()\n const message = extractApiErrorMessage(body)\n if (isDeviceAuthSecurityGate(message)) {\n throw new Error(message)\n }\n }\n log('poll[%d]: pending (%d)', i + 1, res.status)\n continue\n }\n\n const body = await res.text()\n throw new Error(`Device auth poll failed: ${res.status} ${res.statusText} ${body}`)\n }\n\n throw new Error('Device flow timed out after polling limit reached')\n}\n\nasync function exchangeAuthorizationCodeForTokens(\n authorizationCode: string,\n codeVerifier: string\n): Promise<TokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code: authorizationCode,\n redirect_uri: `${ISSUER}/deviceauth/callback`,\n client_id: CLIENT_ID,\n code_verifier: codeVerifier,\n })\n\n const res = await globalThis.fetch(OPENAI_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 rawBody = await res.text()\n throw new Error(`Token exchange failed: ${res.status} ${res.statusText} ${rawBody}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return parseTokenResponse(raw)\n}\n\nasync function exchangeBrowserAuthorizationCode(code: string, codeVerifier: string): Promise<TokenResponse> {\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}`\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: CLIENT_ID,\n code_verifier: codeVerifier,\n })\n\n const res = await globalThis.fetch(OPENAI_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 rawBody = await res.text()\n throw new Error(`Browser token exchange failed: ${res.status} ${res.statusText} ${rawBody}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return parseTokenResponse(raw)\n}\n\n/**\n * Exchange a refresh_token for a new access_token using form-urlencoded POST.\n */\nasync function refreshAccessToken(refreshToken: string): Promise<TokenResponse> {\n log('refreshing access token')\n\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n })\n\n const res = await globalThis.fetch(OPENAI_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 throw new Error(`Token refresh failed: ${res.status} ${res.statusText}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return parseTokenResponse(raw)\n}\n\n/**\n * Check if a request URL should be rewritten to the Codex endpoint.\n */\nfunction shouldRewriteUrl(input: Parameters<typeof globalThis.fetch>[0]): boolean {\n let url: URL\n try {\n if (input instanceof Request) {\n url = new URL(input.url)\n } else {\n url = new URL(String(input))\n }\n } catch {\n return false\n }\n const pathname = url.pathname\n return pathname.includes('/v1/responses') || pathname.includes('/chat/completions')\n}\n\n/**\n * Buffer a streaming SSE response from the Codex endpoint and extract the\n * final response.completed event into a synthetic Responses API JSON object.\n */\nasync function bufferCodexStream(response: Response): Promise<Record<string, unknown>> {\n const text = await response.text()\n const lines = text.split('\\n')\n let lastResponseData: Record<string, unknown> | undefined\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const jsonStr = line.slice(6)\n if (jsonStr === '[DONE]') break\n try {\n const event: unknown = JSON.parse(jsonStr)\n if (event !== null && typeof event === 'object' && !Array.isArray(event)) {\n const e = event as Record<string, unknown>\n // The response.completed or response.done event contains the full response\n if (e.type === 'response.completed' || e.type === 'response.done') {\n const resp = e.response\n if (resp !== null && typeof resp === 'object' && !Array.isArray(resp)) {\n lastResponseData = resp as Record<string, unknown>\n }\n }\n }\n } catch {\n // Malformed SSE line — skip\n }\n }\n\n if (lastResponseData !== undefined) {\n return lastResponseData\n }\n\n // Fallback: return a minimal error response\n log('bufferCodexStream: no response.completed event found in SSE stream')\n return { error: { message: 'Failed to parse streaming response from Codex endpoint' } }\n}\n\n/**\n * Built-in auth plugin for OpenAI Codex (OAuth).\n *\n * Only activates for OAuth credentials (`auth.type === 'oauth'`). API key\n * credentials fall through with an empty options object so the standard\n * OpenAI SDK path handles them.\n *\n * When active the plugin:\n * 1. Sets a dummy apiKey so the SDK doesn't reject construction\n * 2. Wraps fetch to auto-refresh expired tokens via refresh_token\n * 3. Injects `Authorization: Bearer <access_token>`\n * 4. Sets `ChatGPT-Account-Id` from stored accountId or JWT claims\n * 5. Rewrites `/v1/responses` and `/chat/completions` URLs to the Codex endpoint\n */\nexport const codexPlugin: AuthHook = {\n provider: 'openai',\n\n async loader(getAuth: () => Promise<AuthCredential>, _provider: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown>> {\n const auth = await getAuth()\n\n // Only intercept OAuth credentials — API keys use the standard SDK path\n if (auth.type !== 'oauth') {\n log('codex loader: skipping (type=%s)', auth.type)\n return {}\n }\n\n log('codex loader: activating OAuth fetch wrapper')\n return {\n apiKey: OAUTH_DUMMY_KEY,\n async fetch(\n request: Parameters<typeof globalThis.fetch>[0],\n init?: Parameters<typeof globalThis.fetch>[1]\n ): Promise<Response> {\n let currentAuth = await getAuth()\n if (\n currentAuth.expires !== undefined &&\n currentAuth.expires < Date.now() &&\n typeof currentAuth.refresh === 'string'\n ) {\n log('token expired, attempting refresh...')\n try {\n const tokens = await refreshAccessToken(currentAuth.refresh)\n currentAuth = {\n ...currentAuth,\n key: tokens.access_token,\n refresh: tokens.refresh_token ?? currentAuth.refresh,\n expires: Date.now() + tokens.expires_in * 1000,\n }\n await setAuth(currentAuth).catch((err) =>\n log('failed to persist refreshed credential: %s', err instanceof Error ? err.message : String(err)),\n )\n log('token refreshed successfully')\n } catch (err: unknown) {\n log('token refresh failed: %s', err instanceof Error ? err.message : String(err))\n }\n }\n\n const headers = new Headers(init?.headers)\n headers.delete('Authorization')\n\n const token = currentAuth.key ?? ''\n headers.set('Authorization', `Bearer ${token}`)\n\n let accountId = typeof currentAuth.accountId === 'string' ? currentAuth.accountId : undefined\n if (accountId === undefined && token.length > 0) {\n accountId = extractAccountIdFromJwt(token)\n }\n if (typeof accountId === 'string' && accountId.length > 0) {\n headers.set('ChatGPT-Account-Id', accountId)\n }\n\n const isCodexRewrite = shouldRewriteUrl(request)\n const rewritten = isCodexRewrite ? CODEX_API_ENDPOINT : request\n\n // The Codex backend requires store=false, instructions, and stream=true.\n // Patch the request body when routing to the codex endpoint.\n let patchedInit = init\n let needsStreamBuffer = false\n if (isCodexRewrite && init?.body) {\n try {\n const bodyStr =\n typeof init.body === 'string' ? init.body : new TextDecoder().decode(init.body as ArrayBuffer)\n const parsed: unknown = JSON.parse(bodyStr)\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const body = parsed as Record<string, unknown>\n if (body.store !== false) body.store = false\n if (typeof body.instructions !== 'string' || body.instructions.length === 0) {\n body.instructions = 'You are a helpful assistant.'\n }\n // Codex endpoint only supports streaming. If the SDK requested\n // non-streaming, force stream=true and buffer the SSE response.\n if (body.stream !== true) {\n body.stream = true\n needsStreamBuffer = true\n }\n patchedInit = { ...init, body: JSON.stringify(body) }\n }\n } catch {\n // If we can't parse the body, send it as-is\n }\n }\n\n log('codex fetch: rewritten=%s, needsStreamBuffer=%s', isCodexRewrite, needsStreamBuffer)\n const response = await globalThis.fetch(rewritten, { ...patchedInit, headers })\n\n // If we forced streaming, buffer the SSE response and return a\n // synthetic JSON response that matches the Responses API format.\n if (needsStreamBuffer && response.ok && response.body) {\n const syntheticBody = await bufferCodexStream(response)\n return new Response(JSON.stringify(syntheticBody), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n return response\n },\n }\n },\n\n methods: [\n {\n type: 'oauth',\n label: 'ChatGPT Pro/Plus (browser)',\n\n async handler(): Promise<AuthCredential> {\n log('starting browser OAuth flow')\n const oauth = await startBrowserOAuthFlow()\n\n try {\n console.log('Open this URL to continue Codex login:')\n console.log(oauth.authorizationUrl)\n openUrlInBrowser(oauth.authorizationUrl)\n\n const callback = await oauth.callbackPromise\n if (callback.state !== undefined && callback.state !== oauth.expectedState) {\n throw new Error('OAuth state mismatch')\n }\n\n const tokens = await exchangeBrowserAuthorizationCode(callback.code, oauth.codeVerifier)\n\n return {\n type: 'oauth',\n key: tokens.access_token,\n refresh: tokens.refresh_token,\n expires: Date.now() + tokens.expires_in * 1000,\n }\n } finally {\n await oauth.stop()\n }\n },\n },\n {\n type: 'device-flow',\n label: 'ChatGPT Pro/Plus (headless)',\n\n async handler(): Promise<AuthCredential> {\n log('starting OpenAI device flow')\n\n const deviceData = await startDeviceAuth()\n const interval = Number(deviceData.interval ?? 5)\n const verificationUri = OPENAI_DEVICE_VERIFY_URL\n const userCode = deviceData.user_code\n\n log('device flow: user_code=%s', userCode)\n log('device flow: verify at %s', verificationUri)\n\n const authCode = await pollDeviceAuthorizationCode(deviceData.device_auth_id, userCode, interval)\n const tokens = await exchangeAuthorizationCodeForTokens(authCode.authorization_code, authCode.code_verifier)\n\n return {\n type: 'oauth',\n key: tokens.access_token,\n refresh: tokens.refresh_token,\n expires: Date.now() + tokens.expires_in * 1000,\n }\n },\n },\n ] satisfies AuthMethod[],\n}\n","import { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook } from '../types/plugin.js'\n\nconst log = createLogger('plugin:copilot')\n\nconst GITHUB_CLIENT_ID = 'Ov23li8tweQw6odWQebz'\nconst GITHUB_DEFAULT_DOMAIN = 'github.com'\n\nfunction normalizeDomain(url: string): string {\n return url.replace(/^https?:\\/\\//, '').replace(/\\/$/, '')\n}\n\nfunction getUrls(domain: string): { deviceCodeUrl: string; accessTokenUrl: string } {\n return {\n deviceCodeUrl: `https://${domain}/login/device/code`,\n accessTokenUrl: `https://${domain}/login/oauth/access_token`,\n }\n}\n\nfunction resolveEnterpriseDomainFromEnv(): string {\n const raw = process.env.OPENLLMPROVIDER_COPILOT_ENTERPRISE_URL?.trim()\n if (!raw) {\n throw new Error(\n 'Missing OPENLLMPROVIDER_COPILOT_ENTERPRISE_URL. Example: github.company.com or https://github.company.com'\n )\n }\n return normalizeDomain(raw)\n}\n\nasync function runDeviceFlow(domain: string): Promise<AuthCredential> {\n const urls = getUrls(domain)\n const deviceRes = await globalThis.fetch(urls.deviceCodeUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n scope: 'read:user',\n }),\n })\n\n if (!deviceRes.ok) {\n const body = await deviceRes.text()\n throw new Error(`Device flow init failed: ${deviceRes.status} ${deviceRes.statusText} ${body}`)\n }\n\n const deviceData = (await deviceRes.json()) as {\n device_code: string\n user_code: string\n verification_uri: string\n interval: number\n }\n\n log(\n 'device flow: domain=%s user_code=%s verification_uri=%s',\n domain,\n deviceData.user_code,\n deviceData.verification_uri\n )\n const token = await pollForToken(urls.accessTokenUrl, deviceData.device_code, deviceData.interval)\n\n return {\n type: 'oauth',\n refresh: token,\n key: token,\n expires: 0,\n ...(domain !== GITHUB_DEFAULT_DOMAIN ? { enterpriseUrl: domain } : {}),\n }\n}\n\nexport const copilotPlugin: AuthHook = {\n provider: 'github-copilot',\n\n async loader(getAuth, _provider) {\n const auth = await getAuth()\n const enterpriseUrl = typeof auth.enterpriseUrl === 'string' ? auth.enterpriseUrl : undefined\n const baseURL = enterpriseUrl\n ? `https://copilot-api.${normalizeDomain(enterpriseUrl)}`\n : 'https://api.githubcopilot.com'\n\n return {\n baseURL,\n apiKey: '',\n async fetch(...[request, init]: Parameters<typeof globalThis.fetch>): ReturnType<typeof globalThis.fetch> {\n const auth = await getAuth()\n const headers = new Headers(init?.headers)\n // Remove SDK-set auth headers\n headers.delete('x-api-key')\n headers.delete('Authorization')\n // Set copilot-specific auth\n headers.set('Authorization', `Bearer ${auth.refresh ?? auth.key ?? ''}`)\n headers.set('Openai-Intent', 'conversation-edits')\n log('copilot fetch: injecting auth headers')\n return globalThis.fetch(request, { ...init, headers })\n },\n }\n },\n\n methods: [\n {\n type: 'oauth',\n label: 'GitHub Copilot (GitHub.com)',\n async handler(): Promise<AuthCredential> {\n log('starting github.com device flow')\n return runDeviceFlow(GITHUB_DEFAULT_DOMAIN)\n },\n },\n {\n type: 'device-flow',\n label: 'GitHub Copilot Enterprise (Device Flow)',\n async handler(): Promise<AuthCredential> {\n log('starting enterprise device flow')\n const domain = resolveEnterpriseDomainFromEnv()\n return runDeviceFlow(domain)\n },\n },\n ],\n}\n\nasync function pollForToken(accessTokenUrl: string, deviceCode: string, interval: number): Promise<string> {\n const pollInterval = Math.max(interval, 5) * 1000\n\n while (true) {\n await new Promise<void>((resolve) => setTimeout(resolve, pollInterval))\n\n const res = await globalThis.fetch(accessTokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n })\n\n const data = (await res.json()) as { access_token?: string; error?: string }\n\n if (data.access_token) {\n log('device flow: token obtained')\n return data.access_token\n }\n\n if (data.error === 'authorization_pending') {\n log('device flow: waiting for user authorization...')\n continue\n }\n\n if (data.error === 'slow_down') {\n log('device flow: slowing down')\n await new Promise<void>((resolve) => setTimeout(resolve, 5000))\n continue\n }\n\n throw new Error(`Device flow failed: ${data.error ?? 'unknown error'}`)\n }\n}\n","import { spawn } from 'node:child_process'\nimport { createHash, randomBytes, randomUUID } from 'node:crypto'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook, ProviderInfo } from '../types/plugin.js'\n\nconst log = createLogger('plugin:google')\n\nconst GEMINI_CLIENT_ID = '681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com'\nconst GEMINI_CLIENT_SECRET = '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'\nconst GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token'\nconst GOOGLE_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'\nconst GOOGLE_USERINFO_URL = 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json'\nconst GEMINI_REDIRECT_URI = 'http://localhost:8085/oauth2callback'\nconst GEMINI_SCOPES = [\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n]\n\nconst CODE_ASSIST_ENDPOINT = 'https://cloudcode-pa.googleapis.com'\nconst CODE_ASSIST_HEADERS = {\n 'User-Agent': 'google-api-nodejs-client/9.15.1',\n 'X-Goog-Api-Client': 'gl-node/22.17.0',\n 'Client-Metadata': 'ideType=IDE_UNSPECIFIED,platform=PLATFORM_UNSPECIFIED,pluginType=GEMINI',\n}\n\ninterface TokenResponse {\n access_token: string\n refresh_token?: string\n expires_in: number\n token_type: string\n}\n\nfunction resolveProjectId(): string {\n const explicit = process.env.OPENLLMPROVIDER_GOOGLE_PROJECT_ID?.trim()\n if (explicit) return explicit\n const gcp = process.env.GOOGLE_CLOUD_PROJECT?.trim() ?? process.env.GOOGLE_CLOUD_PROJECT_ID?.trim()\n if (gcp) return gcp\n return ''\n}\n\nasync function refreshGoogleToken(refreshToken: string): Promise<TokenResponse> {\n log('refreshing Google OAuth token')\n\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: GEMINI_CLIENT_ID,\n client_secret: GEMINI_CLIENT_SECRET,\n })\n\n const res = await globalThis.fetch(GOOGLE_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 throw new Error(`Google token refresh failed: ${res.status} ${res.statusText}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return {\n access_token: String(raw.access_token ?? ''),\n refresh_token: typeof raw.refresh_token === 'string' ? raw.refresh_token : undefined,\n expires_in: Number(raw.expires_in ?? 3600),\n token_type: String(raw.token_type ?? 'Bearer'),\n }\n}\n\nfunction toBase64Url(inputValue: Buffer): string {\n return inputValue.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nfunction createPkce(): { verifier: string; challenge: string } {\n const verifier = toBase64Url(randomBytes(32))\n const challenge = toBase64Url(createHash('sha256').update(verifier).digest())\n return { verifier, challenge }\n}\n\nfunction buildAuthorizationRequest(): { url: string; verifier: string; state: string } {\n const { verifier, challenge } = createPkce()\n const state = toBase64Url(randomBytes(24))\n\n const url = new URL(GOOGLE_AUTH_URL)\n url.searchParams.set('client_id', GEMINI_CLIENT_ID)\n url.searchParams.set('response_type', 'code')\n url.searchParams.set('redirect_uri', GEMINI_REDIRECT_URI)\n url.searchParams.set('scope', GEMINI_SCOPES.join(' '))\n url.searchParams.set('code_challenge', challenge)\n url.searchParams.set('code_challenge_method', 'S256')\n url.searchParams.set('state', state)\n url.searchParams.set('access_type', 'offline')\n url.searchParams.set('prompt', 'consent')\n\n return { url: url.toString(), verifier, state }\n}\n\nasync function readCallbackInput(question: string): Promise<string> {\n const rl = createInterface({ input, output })\n try {\n return (await rl.question(question)).trim()\n } finally {\n rl.close()\n }\n}\n\nfunction parseCallbackInput(value: string): { code?: string; state?: string } {\n const raw = value.trim()\n if (raw.length === 0) return {}\n\n if (/^https?:\\/\\//i.test(raw)) {\n try {\n const u = new URL(raw)\n return {\n code: u.searchParams.get('code') ?? undefined,\n state: u.searchParams.get('state') ?? undefined,\n }\n } catch {\n return {}\n }\n }\n\n const maybeQuery = raw.startsWith('?') ? raw.slice(1) : raw\n if (maybeQuery.includes('=')) {\n const params = new URLSearchParams(maybeQuery)\n const code = params.get('code') ?? undefined\n const state = params.get('state') ?? undefined\n if (code !== undefined || state !== undefined) {\n return { code, state }\n }\n }\n\n return { code: raw }\n}\n\nfunction openUrlInBrowser(url: string): void {\n const platform = process.platform\n const command = platform === 'darwin' ? 'open' : platform === 'win32' ? 'rundll32' : 'xdg-open'\n const args = platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url]\n try {\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.unref()\n } catch {\n log('failed to open browser automatically')\n }\n}\n\nasync function exchangeAuthorizationCode(code: string, verifier: string): Promise<TokenResponse> {\n const body = new URLSearchParams({\n client_id: GEMINI_CLIENT_ID,\n client_secret: GEMINI_CLIENT_SECRET,\n code,\n grant_type: 'authorization_code',\n redirect_uri: GEMINI_REDIRECT_URI,\n code_verifier: verifier,\n })\n\n const res = await globalThis.fetch(GOOGLE_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 bodyText = await res.text()\n throw new Error(`Google token exchange failed: ${res.status} ${res.statusText} ${bodyText}`)\n }\n\n const raw = (await res.json()) as Record<string, unknown>\n return {\n access_token: String(raw.access_token ?? ''),\n refresh_token: typeof raw.refresh_token === 'string' ? raw.refresh_token : undefined,\n expires_in: Number(raw.expires_in ?? 3600),\n token_type: String(raw.token_type ?? 'Bearer'),\n }\n}\n\nasync function fetchGoogleEmail(accessToken: string): Promise<string | undefined> {\n const res = await globalThis.fetch(GOOGLE_USERINFO_URL, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n if (!res.ok) return undefined\n const raw = (await res.json()) as Record<string, unknown>\n return typeof raw.email === 'string' ? raw.email : undefined\n}\n\ntype FetchInput = Parameters<typeof globalThis.fetch>[0]\ntype FetchInit = Parameters<typeof globalThis.fetch>[1]\ntype FetchBody = NonNullable<FetchInit>['body']\n\nfunction toRequestUrlString(value: FetchInput | URL): string {\n if (typeof value === 'string') return value\n if (value instanceof URL) return value.toString()\n return value.url\n}\n\nfunction parseGenerativeAction(\n input: FetchInput | URL\n): { model: string; action: string; streaming: boolean } | undefined {\n const url = toRequestUrlString(input)\n const match = url.match(/\\/models\\/([^:]+):(\\w+)/)\n if (!match) return undefined\n const model = match[1] ?? ''\n const action = match[2] ?? ''\n if (!model || !action) return undefined\n return { model, action, streaming: action === 'streamGenerateContent' }\n}\n\nfunction buildCodeAssistUrl(action: string, streaming: boolean): string {\n return `${CODE_ASSIST_ENDPOINT}/v1internal:${action}${streaming ? '?alt=sse' : ''}`\n}\n\nfunction rewriteRequestBody(body: FetchBody, projectId: string, model: string): FetchBody {\n if (typeof body !== 'string' || body.length === 0) return body\n try {\n const parsed = JSON.parse(body) as Record<string, unknown>\n if (typeof parsed.project === 'string' && parsed.request !== undefined) {\n const wrapped = { ...parsed, model }\n return JSON.stringify(wrapped)\n }\n const { model: _ignored, ...requestPayload } = parsed\n const userPromptId = randomUUID()\n const wrapped = {\n project: projectId,\n model,\n user_prompt_id: userPromptId,\n request: requestPayload,\n }\n return JSON.stringify(wrapped)\n } catch {\n return body\n }\n}\n\nfunction rewriteStreamingLine(line: string): string {\n if (!line.startsWith('data:')) return line\n const payload = line.slice(5).trim()\n if (!payload || payload === '[DONE]') return line\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>\n const response = parsed.response\n if (response !== undefined) {\n return `data: ${JSON.stringify(response)}`\n }\n return line\n } catch {\n return line\n }\n}\n\nfunction rewriteStreamingBody(stream: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n const decoder = new TextDecoder()\n const encoder = new TextEncoder()\n let buffer = ''\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = stream.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n let idx = buffer.indexOf('\\n')\n while (idx !== -1) {\n const line = buffer.slice(0, idx)\n buffer = buffer.slice(idx + 1)\n controller.enqueue(encoder.encode(`${rewriteStreamingLine(line)}\\n`))\n idx = buffer.indexOf('\\n')\n }\n }\n buffer += decoder.decode()\n if (buffer.length > 0) {\n controller.enqueue(encoder.encode(rewriteStreamingLine(buffer)))\n }\n controller.close()\n } catch (error) {\n controller.error(error)\n } finally {\n reader.releaseLock()\n }\n },\n })\n}\n\nasync function normalizeCodeAssistResponse(response: Response, streaming: boolean): Promise<Response> {\n const contentType = response.headers.get('content-type') ?? ''\n\n if (streaming && response.ok && contentType.includes('text/event-stream') && response.body) {\n return new Response(rewriteStreamingBody(response.body), {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n }\n\n if (!contentType.includes('application/json')) {\n return response\n }\n\n const text = await response.text()\n try {\n const parsed = JSON.parse(text) as Record<string, unknown>\n const next = parsed.response\n if (next !== undefined) {\n return new Response(JSON.stringify(next), {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n }\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n } catch {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n }\n}\n\nexport const googlePlugin: AuthHook = {\n provider: 'google',\n\n async loader(getAuth: () => Promise<AuthCredential>, _provider: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown>> {\n const initialAuth = await getAuth()\n\n if (initialAuth.type !== 'oauth') {\n log('google loader: skipping (type=%s)', initialAuth.type)\n return {}\n }\n\n log('google loader: activating OAuth fetch wrapper')\n return {\n apiKey: 'google-oauth-placeholder',\n async fetch(\n inputValue: Parameters<typeof globalThis.fetch>[0],\n init?: Parameters<typeof globalThis.fetch>[1]\n ): Promise<Response> {\n const currentAuth = await getAuth()\n if (currentAuth.type !== 'oauth') {\n return globalThis.fetch(inputValue, init)\n }\n let currentToken = currentAuth.key ?? ''\n if (\n currentAuth.expires !== undefined &&\n currentAuth.expires < Date.now() &&\n typeof currentAuth.refresh === 'string'\n ) {\n log('token expired, attempting refresh...')\n try {\n const tokens = await refreshGoogleToken(currentAuth.refresh)\n currentToken = tokens.access_token\n const updated: AuthCredential = {\n ...currentAuth,\n key: tokens.access_token,\n refresh: tokens.refresh_token ?? currentAuth.refresh,\n expires: Date.now() + tokens.expires_in * 1000,\n }\n await setAuth(updated).catch((err) =>\n log('failed to persist refreshed credential: %s', err instanceof Error ? err.message : String(err)),\n )\n log('token refreshed successfully, expires in %ds', tokens.expires_in)\n } catch (err: unknown) {\n log('token refresh failed: %s', err instanceof Error ? err.message : String(err))\n }\n }\n\n const rewritten = parseGenerativeAction(inputValue)\n if (!rewritten) {\n const headers = new Headers(init?.headers)\n headers.delete('x-goog-api-key')\n headers.delete('x-api-key')\n headers.set('Authorization', `Bearer ${currentToken}`)\n return globalThis.fetch(inputValue, { ...init, headers })\n }\n\n const projectId = resolveProjectId()\n if (!projectId) {\n throw new Error(\n 'Google OAuth via Code Assist requires project id. Set OPENLLMPROVIDER_GOOGLE_PROJECT_ID (or GOOGLE_CLOUD_PROJECT).'\n )\n }\n\n const headers = new Headers(init?.headers)\n headers.delete('x-goog-api-key')\n headers.delete('x-api-key')\n headers.set('Authorization', `Bearer ${currentToken}`)\n headers.set('User-Agent', CODE_ASSIST_HEADERS['User-Agent'])\n headers.set('X-Goog-Api-Client', CODE_ASSIST_HEADERS['X-Goog-Api-Client'])\n headers.set('Client-Metadata', CODE_ASSIST_HEADERS['Client-Metadata'])\n headers.set('x-activity-request-id', randomUUID())\n if (rewritten.streaming) {\n headers.set('Accept', 'text/event-stream')\n }\n\n const requestUrl = buildCodeAssistUrl(rewritten.action, rewritten.streaming)\n const body = rewriteRequestBody(init?.body, projectId, rewritten.model)\n const response = await globalThis.fetch(requestUrl, {\n ...init,\n headers,\n body,\n })\n\n return normalizeCodeAssistResponse(response, rewritten.streaming)\n },\n }\n },\n\n methods: [\n {\n type: 'oauth',\n label: 'Google OAuth (Gemini)',\n async handler(): Promise<AuthCredential> {\n const authRequest = buildAuthorizationRequest()\n\n console.log('Open this URL to continue Google OAuth:')\n console.log(authRequest.url)\n openUrlInBrowser(authRequest.url)\n\n const callbackInput = await readCallbackInput('Paste the callback URL or authorization code: ')\n const parsed = parseCallbackInput(callbackInput)\n if (!parsed.code) {\n throw new Error('Missing authorization code in callback input')\n }\n if (parsed.state !== undefined && parsed.state !== authRequest.state) {\n throw new Error('OAuth state mismatch')\n }\n\n const tokens = await exchangeAuthorizationCode(parsed.code, authRequest.verifier)\n if (!tokens.refresh_token) {\n throw new Error('Google OAuth did not return a refresh token; retry and grant consent')\n }\n\n const email = await fetchGoogleEmail(tokens.access_token)\n\n return {\n type: 'oauth',\n key: tokens.access_token,\n refresh: tokens.refresh_token,\n expires: Date.now() + tokens.expires_in * 1000,\n email,\n }\n },\n },\n ],\n}\n","import type { LanguageModelV3 } from '@ai-sdk/provider'\nimport { createLogger } from '../logger.js'\n\nconst log = createLogger('provider:bundled')\n\nexport interface ProviderInstance {\n languageModel(modelId: string): LanguageModelV3\n}\n\nexport type ProviderFactory = (options: Record<string, unknown>) => ProviderInstance\n\nconst PROVIDER_LOADERS: Record<string, () => Promise<ProviderFactory>> = {\n '@ai-sdk/anthropic': () => import('@ai-sdk/anthropic').then((m) => m.createAnthropic as unknown as ProviderFactory),\n '@ai-sdk/openai': () => import('@ai-sdk/openai').then((m) => m.createOpenAI as unknown as ProviderFactory),\n '@ai-sdk/google': () =>\n import('@ai-sdk/google').then((m) => m.createGoogleGenerativeAI as unknown as ProviderFactory),\n '@ai-sdk/google-vertex': () =>\n import('@ai-sdk/google-vertex').then((m) => m.createVertex as unknown as ProviderFactory),\n '@ai-sdk/amazon-bedrock': () =>\n import('@ai-sdk/amazon-bedrock').then((m) => m.createAmazonBedrock as unknown as ProviderFactory),\n '@ai-sdk/azure': () => import('@ai-sdk/azure').then((m) => m.createAzure as unknown as ProviderFactory),\n '@ai-sdk/openai-compatible': () =>\n import('@ai-sdk/openai-compatible').then((m) => m.createOpenAICompatible as unknown as ProviderFactory),\n '@ai-sdk/xai': () => import('@ai-sdk/xai').then((m) => m.createXai as unknown as ProviderFactory),\n '@ai-sdk/mistral': () => import('@ai-sdk/mistral').then((m) => m.createMistral as unknown as ProviderFactory),\n '@ai-sdk/groq': () => import('@ai-sdk/groq').then((m) => m.createGroq as unknown as ProviderFactory),\n '@openrouter/ai-sdk-provider': () =>\n import('@openrouter/ai-sdk-provider').then((m) => m.createOpenRouter as unknown as ProviderFactory),\n}\n\nconst loadedProviders = new Map<string, ProviderFactory>()\nconst unavailableProviders = new Set<string>()\n\nexport async function loadProvider(packageName: string): Promise<ProviderFactory | undefined> {\n if (loadedProviders.has(packageName)) return loadedProviders.get(packageName)\n if (unavailableProviders.has(packageName)) return undefined\n\n const loader = PROVIDER_LOADERS[packageName]\n if (loader === undefined) return undefined\n\n try {\n const factory = await loader()\n loadedProviders.set(packageName, factory)\n log('loaded provider package: %s', packageName)\n return factory\n } catch {\n unavailableProviders.add(packageName)\n log('provider package not available: %s (not installed)', packageName)\n return undefined\n }\n}\n\nexport async function isProviderInstalled(packageName: string): Promise<boolean> {\n return (await loadProvider(packageName)) !== undefined\n}\n\nexport function getAllProviderPackages(): string[] {\n return Object.keys(PROVIDER_LOADERS)\n}\n","import type { AuthStore } from '../auth/store.js'\nimport type { Catalog } from '../catalog/catalog.js'\nimport { createLogger } from '../logger.js'\nimport { loadPluginOptions } from '../plugin/index.js'\nimport type { SecretRef } from '../types/auth.js'\nimport type { ProviderUserConfig } from '../types/provider.js'\n\nconst log = createLogger('provider:state')\n\nexport interface ProviderState {\n id: string\n key?: string\n options: Record<string, unknown>\n source: 'env' | 'disk' | 'auth' | 'plugin' | 'config' | 'none'\n location?: string\n}\n\nasync function resolveSecretRef(ref: SecretRef): Promise<string | undefined> {\n if (typeof ref === 'string') return ref\n if (ref.type === 'plain') return ref.value\n if (ref.type === 'env') return process.env[ref.name]\n return undefined\n}\n\nconst GOOGLE_PROVIDERS = new Set(['@ai-sdk/google', '@ai-sdk/google-vertex'])\nfunction normalizeProviderBaseURL(providerId: string, baseURL: string): string {\n if (providerId !== 'openai') return baseURL\n\n try {\n const parsed = new URL(baseURL)\n const path = parsed.pathname.replace(/\\/+$/, '')\n if (path === '' || path === '/') {\n parsed.pathname = '/v1'\n }\n return parsed.toString().replace(/\\/$/, '')\n } catch {\n return baseURL\n }\n}\n\nfunction resolveAuthBaseURL(authCred: Record<string, unknown> | undefined): string | undefined {\n if (authCred === undefined) return undefined\n if (typeof authCred.baseURL === 'string' && authCred.baseURL.trim().length > 0) return authCred.baseURL.trim()\n if (typeof authCred.apiHost === 'string' && authCred.apiHost.trim().length > 0) return authCred.apiHost.trim()\n if (typeof authCred.host === 'string' && authCred.host.trim().length > 0) return authCred.host.trim()\n return undefined\n}\n\nexport async function buildProviderState(config: {\n catalog: Catalog\n authStore: AuthStore\n userConfig?: Record<string, ProviderUserConfig>\n}): Promise<Record<string, ProviderState>> {\n const { catalog, authStore, userConfig } = config\n\n log('building provider state')\n\n const allProviders = catalog.listProviders()\n const authCredentials = await authStore.all()\n\n log('found %d catalog providers, %d auth entries', allProviders.length, Object.keys(authCredentials).length)\n\n const result: Record<string, ProviderState> = {}\n\n for (const catalogProvider of allProviders) {\n const pid = catalogProvider.id\n const options: Record<string, unknown> = {}\n let key: string | undefined\n let source: ProviderState['source'] = 'none'\n let location: string | undefined\n if (catalogProvider.baseURL !== undefined) {\n options.baseURL = normalizeProviderBaseURL(pid, catalogProvider.baseURL)\n }\n if (catalogProvider.headers !== undefined) options.headers = { ...catalogProvider.headers }\n if (catalogProvider.options !== undefined) Object.assign(options, catalogProvider.options)\n if (catalogProvider.env !== undefined) {\n for (const envVar of catalogProvider.env) {\n const val = process.env[envVar]\n if (val !== undefined) {\n key = val\n source = 'env'\n location = `env:${envVar}`\n break\n }\n }\n }\n const authCred = authCredentials[pid]\n const authBaseURL = resolveAuthBaseURL(authCred as Record<string, unknown> | undefined)\n if (authBaseURL !== undefined) {\n options.baseURL = normalizeProviderBaseURL(pid, authBaseURL)\n }\n if (authCred?.key !== undefined) {\n key = authCred.key\n source = 'auth'\n location = authCred.location\n const bp = catalogProvider.bundledProvider\n if (authCred.type === 'oauth' && bp !== undefined) {\n if (GOOGLE_PROVIDERS.has(bp)) {\n const token = authCred.key\n options.fetch = (url: string | URL | Request, init?: RequestInit) => {\n const h = new Headers(init?.headers)\n h.delete('x-goog-api-key')\n h.set('Authorization', `Bearer ${token}`)\n return globalThis.fetch(url, { ...init, headers: h })\n }\n }\n }\n }\n\n const getAuth = async () => {\n const preferred = await authStore.getPreferred?.(pid, 'oauth')\n return preferred ?? authCred ?? { type: 'api' as const }\n }\n const setAuth = async (credential: Parameters<AuthStore['set']>[1]) => {\n await authStore.set(pid, credential)\n }\n const pluginOpts = await loadPluginOptions(pid, getAuth, { id: pid, name: catalogProvider.name }, setAuth)\n if (pluginOpts !== undefined) {\n Object.assign(options, pluginOpts)\n const pluginKey = pluginOpts.apiKey\n if (typeof pluginKey === 'string') {\n key = pluginKey\n source = 'plugin'\n }\n // Resolve actual auth credential to track correct location\n const resolvedAuth = await getAuth()\n if (resolvedAuth.location) {\n location = resolvedAuth.location\n }\n }\n\n const userCfg = userConfig?.[pid]\n if (userCfg !== undefined) {\n if (userCfg.baseURL !== undefined) options.baseURL = normalizeProviderBaseURL(pid, userCfg.baseURL)\n if (userCfg.headers !== undefined) {\n const existingHeaders = options.headers\n options.headers = {\n ...(existingHeaders !== null && typeof existingHeaders === 'object' && !Array.isArray(existingHeaders)\n ? (existingHeaders as Record<string, string>)\n : {}),\n ...userCfg.headers,\n }\n }\n if (userCfg.options !== undefined) Object.assign(options, userCfg.options)\n if (userCfg.apiKey !== undefined) {\n const resolved = await resolveSecretRef(userCfg.apiKey)\n if (resolved !== undefined) {\n key = resolved\n source = 'config'\n log('%s: resolved key from user config', pid)\n }\n }\n }\n\n if (source !== 'none') {\n log('%s: source=%s, location=%s', pid, source, location ?? 'n/a')\n }\n result[pid] = { id: pid, key, options, source, location }\n }\n\n log('provider state built for %d providers', Object.keys(result).length)\n return result\n}\n","import type { LanguageModelV3 } from '@ai-sdk/provider'\nimport type { AuthStore } from '../auth/store.js'\nimport { createAuthStore } from '../auth/store.js'\nimport type { CatalogProvider, ExtendConfig } from '../catalog/catalog.js'\nimport { Catalog } from '../catalog/catalog.js'\nimport { createLogger } from '../logger.js'\nimport { anthropicPlugin } from '../plugin/anthropic.js'\nimport { codexPlugin } from '../plugin/codex.js'\nimport { copilotPlugin } from '../plugin/copilot.js'\nimport { googlePlugin } from '../plugin/google.js'\nimport { registerPlugin } from '../plugin/index.js'\nimport type { ModelDefinition } from '../types/model.js'\nimport type { ProviderUserConfig } from '../types/provider.js'\nimport { isProviderInstalled, loadProvider } from './bundled.js'\nimport { buildProviderState } from './state.js'\n\nexport type { ProviderInstance, ProviderFactory } from './bundled.js'\nexport { loadProvider, isProviderInstalled, getAllProviderPackages } from './bundled.js'\n\nconst log = createLogger('provider')\n\nconst DEFAULT_PROVIDERS: Record<string, { name: string; env: string[]; bundledProvider: string }> = {\n anthropic: { name: 'Anthropic', env: ['ANTHROPIC_API_KEY'], bundledProvider: '@ai-sdk/anthropic' },\n openai: { name: 'OpenAI', env: ['OPENAI_API_KEY'], bundledProvider: '@ai-sdk/openai' },\n google: {\n name: 'Google AI',\n env: ['GOOGLE_GENERATIVE_AI_API_KEY', 'GOOGLE_API_KEY'],\n bundledProvider: '@ai-sdk/google',\n },\n 'google-vertex': { name: 'Google Vertex AI', env: [], bundledProvider: '@ai-sdk/google-vertex' },\n 'amazon-bedrock': { name: 'Amazon Bedrock', env: [], bundledProvider: '@ai-sdk/amazon-bedrock' },\n azure: { name: 'Azure OpenAI', env: ['AZURE_API_KEY'], bundledProvider: '@ai-sdk/azure' },\n xai: { name: 'xAI', env: ['XAI_API_KEY'], bundledProvider: '@ai-sdk/xai' },\n mistral: { name: 'Mistral', env: ['MISTRAL_API_KEY'], bundledProvider: '@ai-sdk/mistral' },\n groq: { name: 'Groq', env: ['GROQ_API_KEY'], bundledProvider: '@ai-sdk/groq' },\n openrouter: { name: 'OpenRouter', env: ['OPENROUTER_API_KEY'], bundledProvider: '@openrouter/ai-sdk-provider' },\n 'github-copilot': { name: 'GitHub Copilot', env: [], bundledProvider: '@ai-sdk/openai-compatible' },\n}\n\nfunction resolveBundledProviderKey(providerId: string, catalogProvider?: CatalogProvider): string | undefined {\n if (catalogProvider?.bundledProvider !== undefined) return catalogProvider.bundledProvider\n return DEFAULT_PROVIDERS[providerId]?.bundledProvider\n}\n\nexport interface ProviderStoreConfig {\n userConfig?: Record<string, ProviderUserConfig>\n}\n\nexport interface ProviderListOptions {\n includeUnavailable?: boolean\n}\n\nexport interface ModelListOptions {\n includeUnavailable?: boolean\n}\n\nexport interface GetModelOptions {\n includeUnavailable?: boolean\n}\n\nexport interface ProviderStore {\n getLanguageModel(providerId: string, modelId: string): Promise<LanguageModelV3>\n extend(config: ExtendConfig): void\n listProviders(options?: ProviderListOptions): Promise<CatalogProvider[]>\n listModels(providerId?: string, options?: ModelListOptions): Promise<ModelDefinition[]>\n getModel(providerId: string, modelId: string, options?: GetModelOptions): Promise<ModelDefinition | undefined>\n}\n\nexport function createProviderStore(authStore: AuthStore, config?: ProviderStoreConfig): ProviderStore {\n const catalog = new Catalog()\n registerPlugin(copilotPlugin)\n registerPlugin(codexPlugin)\n registerPlugin(googlePlugin)\n registerPlugin(anthropicPlugin)\n catalog.extend({\n providers: Object.fromEntries(\n Object.entries(DEFAULT_PROVIDERS).map(([id, p]) => [\n id,\n { name: p.name, env: p.env, bundledProvider: p.bundledProvider },\n ])\n ),\n })\n const userConfig = config?.userConfig\n let stateCache: Promise<Record<string, import('./state.js').ProviderState>> | null = null\n let catalogRefreshTask: Promise<void> | null = null\n\n function invalidateState() {\n stateCache = null\n }\n\n function getState() {\n if (stateCache === null) {\n log('initializing provider state')\n stateCache = buildProviderState({ catalog, authStore, userConfig })\n }\n return stateCache\n }\n\n async function ensureCatalogEnriched(): Promise<void> {\n if (catalogRefreshTask === null) {\n catalogRefreshTask = (async () => {\n const result = await catalog.refresh()\n if (!result.success) {\n log('catalog refresh failed: %s', result.error?.message ?? 'unknown error')\n return\n }\n log('catalog refreshed with %d providers', result.updatedProviders.length)\n invalidateState()\n })()\n }\n await catalogRefreshTask\n }\n\n function hasProviderAuth(state: Record<string, import('./state.js').ProviderState>, providerId: string): boolean {\n const providerState = state[providerId]\n return providerState !== undefined && providerState.source !== 'none'\n }\n\n async function checkProviderUsable(providerId: string): Promise<boolean> {\n const catalogProvider = catalog.getProvider(providerId)\n const bundledKey = resolveBundledProviderKey(providerId, catalogProvider)\n if (bundledKey === undefined) return false\n return isProviderInstalled(bundledKey)\n }\n\n return {\n async getLanguageModel(providerId: string, modelId: string): Promise<LanguageModelV3> {\n await ensureCatalogEnriched()\n const state = await getState()\n const providerState = state[providerId]\n\n log(\n 'getLanguageModel(%s, %s) — auth: source=%s, location=%s',\n providerId,\n modelId,\n providerState?.source ?? 'none',\n providerState?.location ?? 'unknown'\n )\n if (providerState === undefined) {\n throw new Error(`Provider not found in catalog: ${providerId}`)\n }\n\n const catalogProvider = catalog.getProvider(providerId)\n const bundledKey = resolveBundledProviderKey(providerId, catalogProvider)\n\n if (bundledKey === undefined) {\n throw new Error(\n `No bundled provider mapping found for: ${providerId}. Set bundledProvider in catalog extend() config.`\n )\n }\n\n const factory = await loadProvider(bundledKey)\n\n if (factory === undefined) {\n throw new Error(`Provider package not available: ${bundledKey}. Install it with: npm install ${bundledKey}`)\n }\n\n log('creating SDK for %s using %s', providerId, bundledKey)\n\n const sdkOptions = { ...providerState.options }\n if (providerState.key !== undefined) {\n sdkOptions.apiKey = providerState.key\n }\n // authToken and apiKey must not coexist (e.g. @ai-sdk/anthropic rejects both)\n if (sdkOptions.authToken !== undefined) {\n sdkOptions.apiKey = undefined\n }\n\n const sdk = factory(sdkOptions)\n log('calling sdk.languageModel(%s)', modelId)\n return sdk.languageModel(modelId)\n },\n\n extend(extendConfig: ExtendConfig): void {\n catalog.extend(extendConfig)\n invalidateState()\n },\n\n async listProviders(options?: ProviderListOptions): Promise<CatalogProvider[]> {\n await ensureCatalogEnriched()\n const allProviders = catalog.listProviders()\n\n const usabilityChecks = await Promise.all(\n allProviders.map(async (p) => ({ provider: p, usable: await checkProviderUsable(p.id) }))\n )\n const installedProviders = usabilityChecks.filter((r) => r.usable).map((r) => r.provider)\n\n if (options?.includeUnavailable === true) {\n return installedProviders\n }\n const state = await getState()\n return installedProviders.filter((provider) => hasProviderAuth(state, provider.id))\n },\n\n async listModels(providerId?: string, options?: ModelListOptions): Promise<ModelDefinition[]> {\n await ensureCatalogEnriched()\n if (options?.includeUnavailable === true) {\n return catalog.listModels(providerId)\n }\n\n const state = await getState()\n if (providerId !== undefined) {\n if (!hasProviderAuth(state, providerId)) {\n return []\n }\n return catalog.listModels(providerId)\n }\n\n const allProviders = catalog.listProviders()\n const usabilityChecks = await Promise.all(\n allProviders.map(async (p) => ({\n provider: p,\n usable: (await checkProviderUsable(p.id)) && hasProviderAuth(state, p.id),\n }))\n )\n\n const results: ModelDefinition[] = []\n for (const { provider, usable } of usabilityChecks) {\n if (usable) {\n results.push(...catalog.listModels(provider.id))\n }\n }\n return results\n },\n\n async getModel(\n providerId: string,\n modelId: string,\n options?: GetModelOptions\n ): Promise<ModelDefinition | undefined> {\n await ensureCatalogEnriched()\n if (options?.includeUnavailable !== true) {\n const state = await getState()\n if (!hasProviderAuth(state, providerId)) {\n return undefined\n }\n }\n return catalog.getModel(providerId, modelId)\n },\n }\n}\n\nexport function getLanguageModel(\n providerId: string,\n modelId: string,\n config?: ProviderStoreConfig\n): Promise<LanguageModelV3> {\n return createProviderStore(createAuthStore(), config).getLanguageModel(providerId, modelId)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import createDebug from "debug";
|
|
2
|
+
|
|
3
|
+
//#region src/logger.ts
|
|
4
|
+
function createLogger(namespace) {
|
|
5
|
+
return createDebug(`openllmprovider:${namespace}`);
|
|
6
|
+
}
|
|
7
|
+
const log = createDebug("openllmprovider");
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createLogger as t };
|
|
11
|
+
//# sourceMappingURL=logger-BsHpI_fH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-BsHpI_fH.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import createDebug from 'debug'\n\nexport function createLogger(namespace: string) {\n return createDebug(`openllmprovider:${namespace}`)\n}\n\nexport const log = createDebug('openllmprovider')\n"],"mappings":";;;AAEA,SAAgB,aAAa,WAAmB;AAC9C,QAAO,YAAY,mBAAmB,YAAY;;AAGpD,MAAa,MAAM,YAAY,kBAAkB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __exportAll = (all, no_symbols) => {
|
|
9
|
+
let target = {};
|
|
10
|
+
for (var name in all) {
|
|
11
|
+
__defProp(target, name, {
|
|
12
|
+
get: all[name],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
if (!no_symbols) {
|
|
17
|
+
__defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
18
|
+
}
|
|
19
|
+
return target;
|
|
20
|
+
};
|
|
21
|
+
var __copyProps = (to, from, except, desc) => {
|
|
22
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
23
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
24
|
+
key = keys[i];
|
|
25
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
26
|
+
__defProp(to, key, {
|
|
27
|
+
get: ((k) => from[k]).bind(null, key),
|
|
28
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return to;
|
|
34
|
+
};
|
|
35
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
36
|
+
value: mod,
|
|
37
|
+
enumerable: true
|
|
38
|
+
}) : target, mod));
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
let debug = require("debug");
|
|
42
|
+
debug = __toESM(debug);
|
|
43
|
+
|
|
44
|
+
//#region src/logger.ts
|
|
45
|
+
function createLogger(namespace) {
|
|
46
|
+
return (0, debug.default)(`openllmprovider:${namespace}`);
|
|
47
|
+
}
|
|
48
|
+
const log = (0, debug.default)("openllmprovider");
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
Object.defineProperty(exports, '__exportAll', {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
get: function () {
|
|
54
|
+
return __exportAll;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
Object.defineProperty(exports, '__toESM', {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get: function () {
|
|
60
|
+
return __toESM;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(exports, 'createLogger', {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get: function () {
|
|
66
|
+
return createLogger;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=logger-jRimlMFR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-jRimlMFR.cjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import createDebug from 'debug'\n\nexport function createLogger(namespace: string) {\n return createDebug(`openllmprovider:${namespace}`)\n}\n\nexport const log = createDebug('openllmprovider')\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAgB,aAAa,WAAmB;AAC9C,2BAAmB,mBAAmB,YAAY;;AAGpD,MAAa,yBAAkB,kBAAkB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_logger = require('../logger-jRimlMFR.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/plugin/index.ts
|
|
5
|
+
const log = require_logger.createLogger("plugin");
|
|
6
|
+
const plugins = /* @__PURE__ */ new Map();
|
|
7
|
+
function registerPlugin(plugin) {
|
|
8
|
+
log("registering plugin for provider: %s", plugin.provider);
|
|
9
|
+
plugins.set(plugin.provider, plugin);
|
|
10
|
+
}
|
|
11
|
+
function getPlugins() {
|
|
12
|
+
return [...plugins.values()];
|
|
13
|
+
}
|
|
14
|
+
function getPluginForProvider(providerId) {
|
|
15
|
+
return plugins.get(providerId);
|
|
16
|
+
}
|
|
17
|
+
async function loadPluginOptions(providerId, getAuth, providerInfo, setAuth) {
|
|
18
|
+
const plugin = plugins.get(providerId);
|
|
19
|
+
if (!plugin) return void 0;
|
|
20
|
+
log("loading plugin options for provider: %s", providerId);
|
|
21
|
+
return plugin.loader(getAuth, providerInfo, setAuth);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
exports.getPluginForProvider = getPluginForProvider;
|
|
26
|
+
exports.getPlugins = getPlugins;
|
|
27
|
+
exports.loadPluginOptions = loadPluginOptions;
|
|
28
|
+
exports.registerPlugin = registerPlugin;
|
|
29
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createLogger"],"sources":["../../src/plugin/index.ts"],"sourcesContent":["import { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook, ProviderInfo } from '../types/plugin.js'\n\nconst log = createLogger('plugin')\nconst plugins: Map<string, AuthHook> = new Map()\n\nexport function registerPlugin(plugin: AuthHook): void {\n log('registering plugin for provider: %s', plugin.provider)\n plugins.set(plugin.provider, plugin)\n}\n\nexport function getPlugins(): AuthHook[] {\n return [...plugins.values()]\n}\n\nexport function getPluginForProvider(providerId: string): AuthHook | undefined {\n return plugins.get(providerId)\n}\n\nexport async function loadPluginOptions(\n providerId: string,\n getAuth: () => Promise<AuthCredential>,\n providerInfo: ProviderInfo,\n setAuth: (credential: AuthCredential) => Promise<void>,\n): Promise<Record<string, unknown> | undefined> {\n const plugin = plugins.get(providerId)\n if (!plugin) return undefined\n log('loading plugin options for provider: %s', providerId)\n return plugin.loader(getAuth, providerInfo, setAuth)\n}\n"],"mappings":";;;;AAGA,MAAM,MAAMA,4BAAa,SAAS;AAClC,MAAM,0BAAiC,IAAI,KAAK;AAEhD,SAAgB,eAAe,QAAwB;AACrD,KAAI,uCAAuC,OAAO,SAAS;AAC3D,SAAQ,IAAI,OAAO,UAAU,OAAO;;AAGtC,SAAgB,aAAyB;AACvC,QAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC;;AAG9B,SAAgB,qBAAqB,YAA0C;AAC7E,QAAO,QAAQ,IAAI,WAAW;;AAGhC,eAAsB,kBACpB,YACA,SACA,cACA,SAC8C;CAC9C,MAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,2CAA2C,WAAW;AAC1D,QAAO,OAAO,OAAO,SAAS,cAAc,QAAQ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { i as ProviderInfo, n as AuthHook, t as AuthCredential } from "../plugin-wK7RmJhZ.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/plugin/index.d.ts
|
|
4
|
+
declare function registerPlugin(plugin: AuthHook): void;
|
|
5
|
+
declare function getPlugins(): AuthHook[];
|
|
6
|
+
declare function getPluginForProvider(providerId: string): AuthHook | undefined;
|
|
7
|
+
declare function loadPluginOptions(providerId: string, getAuth: () => Promise<AuthCredential>, providerInfo: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown> | undefined>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getPluginForProvider, getPlugins, loadPluginOptions, registerPlugin };
|
|
10
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/plugin/index.ts"],"mappings":";;;iBAMgB,cAAA,CAAe,MAAA,EAAQ,QAAA;AAAA,iBAKvB,UAAA,CAAA,GAAc,QAAA;AAAA,iBAId,oBAAA,CAAqB,UAAA,WAAqB,QAAA;AAAA,iBAIpC,iBAAA,CACpB,UAAA,UACA,OAAA,QAAe,OAAA,CAAQ,cAAA,GACvB,YAAA,EAAc,YAAA,EACd,OAAA,GAAU,UAAA,EAAY,cAAA,KAAmB,OAAA,SACxC,OAAA,CAAQ,MAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { i as ProviderInfo, n as AuthHook, t as AuthCredential } from "../plugin-BkeUu5LW.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/plugin/index.d.ts
|
|
4
|
+
declare function registerPlugin(plugin: AuthHook): void;
|
|
5
|
+
declare function getPlugins(): AuthHook[];
|
|
6
|
+
declare function getPluginForProvider(providerId: string): AuthHook | undefined;
|
|
7
|
+
declare function loadPluginOptions(providerId: string, getAuth: () => Promise<AuthCredential>, providerInfo: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown> | undefined>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getPluginForProvider, getPlugins, loadPluginOptions, registerPlugin };
|
|
10
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/plugin/index.ts"],"mappings":";;;iBAMgB,cAAA,CAAe,MAAA,EAAQ,QAAA;AAAA,iBAKvB,UAAA,CAAA,GAAc,QAAA;AAAA,iBAId,oBAAA,CAAqB,UAAA,WAAqB,QAAA;AAAA,iBAIpC,iBAAA,CACpB,UAAA,UACA,OAAA,QAAe,OAAA,CAAQ,cAAA,GACvB,YAAA,EAAc,YAAA,EACd,OAAA,GAAU,UAAA,EAAY,cAAA,KAAmB,OAAA,SACxC,OAAA,CAAQ,MAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { t as createLogger } from "../logger-BsHpI_fH.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/plugin/index.ts
|
|
4
|
+
const log = createLogger("plugin");
|
|
5
|
+
const plugins = /* @__PURE__ */ new Map();
|
|
6
|
+
function registerPlugin(plugin) {
|
|
7
|
+
log("registering plugin for provider: %s", plugin.provider);
|
|
8
|
+
plugins.set(plugin.provider, plugin);
|
|
9
|
+
}
|
|
10
|
+
function getPlugins() {
|
|
11
|
+
return [...plugins.values()];
|
|
12
|
+
}
|
|
13
|
+
function getPluginForProvider(providerId) {
|
|
14
|
+
return plugins.get(providerId);
|
|
15
|
+
}
|
|
16
|
+
async function loadPluginOptions(providerId, getAuth, providerInfo, setAuth) {
|
|
17
|
+
const plugin = plugins.get(providerId);
|
|
18
|
+
if (!plugin) return void 0;
|
|
19
|
+
log("loading plugin options for provider: %s", providerId);
|
|
20
|
+
return plugin.loader(getAuth, providerInfo, setAuth);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { getPluginForProvider, getPlugins, loadPluginOptions, registerPlugin };
|
|
25
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugin/index.ts"],"sourcesContent":["import { createLogger } from '../logger.js'\nimport type { AuthCredential, AuthHook, ProviderInfo } from '../types/plugin.js'\n\nconst log = createLogger('plugin')\nconst plugins: Map<string, AuthHook> = new Map()\n\nexport function registerPlugin(plugin: AuthHook): void {\n log('registering plugin for provider: %s', plugin.provider)\n plugins.set(plugin.provider, plugin)\n}\n\nexport function getPlugins(): AuthHook[] {\n return [...plugins.values()]\n}\n\nexport function getPluginForProvider(providerId: string): AuthHook | undefined {\n return plugins.get(providerId)\n}\n\nexport async function loadPluginOptions(\n providerId: string,\n getAuth: () => Promise<AuthCredential>,\n providerInfo: ProviderInfo,\n setAuth: (credential: AuthCredential) => Promise<void>,\n): Promise<Record<string, unknown> | undefined> {\n const plugin = plugins.get(providerId)\n if (!plugin) return undefined\n log('loading plugin options for provider: %s', providerId)\n return plugin.loader(getAuth, providerInfo, setAuth)\n}\n"],"mappings":";;;AAGA,MAAM,MAAM,aAAa,SAAS;AAClC,MAAM,0BAAiC,IAAI,KAAK;AAEhD,SAAgB,eAAe,QAAwB;AACrD,KAAI,uCAAuC,OAAO,SAAS;AAC3D,SAAQ,IAAI,OAAO,UAAU,OAAO;;AAGtC,SAAgB,aAAyB;AACvC,QAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC;;AAG9B,SAAgB,qBAAqB,YAA0C;AAC7E,QAAO,QAAQ,IAAI,WAAW;;AAGhC,eAAsB,kBACpB,YACA,SACA,cACA,SAC8C;CAC9C,MAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,2CAA2C,WAAW;AAC1D,QAAO,OAAO,OAAO,SAAS,cAAc,QAAQ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/types/plugin.d.ts
|
|
2
|
+
interface ProviderInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Unified credential for all auth types.
|
|
8
|
+
*
|
|
9
|
+
* API key auth (type: 'api'):
|
|
10
|
+
* - key: the API key string (e.g. sk-ant-xxx for Anthropic, sk-xxx for OpenAI)
|
|
11
|
+
*
|
|
12
|
+
* OAuth auth (type: 'oauth'):
|
|
13
|
+
* - key: short-lived access_token for API calls
|
|
14
|
+
* - refresh: long-lived refresh_token used to obtain a new access_token when expired
|
|
15
|
+
* - expires: absolute timestamp (ms) when the access_token expires
|
|
16
|
+
*
|
|
17
|
+
* Well-known auth (type: 'wellknown'):
|
|
18
|
+
* - key: credential discovered from well-known config file locations
|
|
19
|
+
*/
|
|
20
|
+
interface AuthCredential {
|
|
21
|
+
type: 'api' | 'oauth' | 'wellknown';
|
|
22
|
+
/** API key (type 'api') or OAuth access_token (type 'oauth') */
|
|
23
|
+
key?: string;
|
|
24
|
+
/** OAuth refresh_token — only present when type is 'oauth' */
|
|
25
|
+
refresh?: string;
|
|
26
|
+
/** Absolute timestamp (ms) when the access_token expires — only present when type is 'oauth' */
|
|
27
|
+
expires?: number;
|
|
28
|
+
baseURL?: string;
|
|
29
|
+
apiHost?: string;
|
|
30
|
+
host?: string;
|
|
31
|
+
location?: string;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
interface AuthMethod {
|
|
35
|
+
type: string;
|
|
36
|
+
label: string;
|
|
37
|
+
handler(): Promise<AuthCredential>;
|
|
38
|
+
}
|
|
39
|
+
interface AuthHook {
|
|
40
|
+
provider: string;
|
|
41
|
+
loader(getAuth: () => Promise<AuthCredential>, provider: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown>>;
|
|
42
|
+
methods: AuthMethod[];
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ProviderInfo as i, AuthHook as n, AuthMethod as r, AuthCredential as t };
|
|
46
|
+
//# sourceMappingURL=plugin-BkeUu5LW.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-BkeUu5LW.d.mts","names":[],"sources":["../src/types/plugin.ts"],"mappings":";UAAiB,YAAA;EACf,EAAA;EACA,IAAA;AAAA;;;AAiBF;;;;;;;;;;;;UAAiB,cAAA;EACf,IAAA;EAWY;EATZ,GAAA;EAYyB;EAVzB,OAAA;EAakB;EAXlB,OAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,QAAA;EAAA,CACC,GAAA;AAAA;AAAA,UAGc,UAAA;EACf,IAAA;EACA,KAAA;EACA,OAAA,IAAW,OAAA,CAAQ,cAAA;AAAA;AAAA,UAGJ,QAAA;EACf,QAAA;EACA,MAAA,CACE,OAAA,QAAe,OAAA,CAAQ,cAAA,GACvB,QAAA,EAAU,YAAA,EACV,OAAA,GAAU,UAAA,EAAY,cAAA,KAAmB,OAAA,SACxC,OAAA,CAAQ,MAAA;EACX,OAAA,EAAS,UAAA;AAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/types/plugin.d.ts
|
|
2
|
+
interface ProviderInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Unified credential for all auth types.
|
|
8
|
+
*
|
|
9
|
+
* API key auth (type: 'api'):
|
|
10
|
+
* - key: the API key string (e.g. sk-ant-xxx for Anthropic, sk-xxx for OpenAI)
|
|
11
|
+
*
|
|
12
|
+
* OAuth auth (type: 'oauth'):
|
|
13
|
+
* - key: short-lived access_token for API calls
|
|
14
|
+
* - refresh: long-lived refresh_token used to obtain a new access_token when expired
|
|
15
|
+
* - expires: absolute timestamp (ms) when the access_token expires
|
|
16
|
+
*
|
|
17
|
+
* Well-known auth (type: 'wellknown'):
|
|
18
|
+
* - key: credential discovered from well-known config file locations
|
|
19
|
+
*/
|
|
20
|
+
interface AuthCredential {
|
|
21
|
+
type: 'api' | 'oauth' | 'wellknown';
|
|
22
|
+
/** API key (type 'api') or OAuth access_token (type 'oauth') */
|
|
23
|
+
key?: string;
|
|
24
|
+
/** OAuth refresh_token — only present when type is 'oauth' */
|
|
25
|
+
refresh?: string;
|
|
26
|
+
/** Absolute timestamp (ms) when the access_token expires — only present when type is 'oauth' */
|
|
27
|
+
expires?: number;
|
|
28
|
+
baseURL?: string;
|
|
29
|
+
apiHost?: string;
|
|
30
|
+
host?: string;
|
|
31
|
+
location?: string;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
interface AuthMethod {
|
|
35
|
+
type: string;
|
|
36
|
+
label: string;
|
|
37
|
+
handler(): Promise<AuthCredential>;
|
|
38
|
+
}
|
|
39
|
+
interface AuthHook {
|
|
40
|
+
provider: string;
|
|
41
|
+
loader(getAuth: () => Promise<AuthCredential>, provider: ProviderInfo, setAuth: (credential: AuthCredential) => Promise<void>): Promise<Record<string, unknown>>;
|
|
42
|
+
methods: AuthMethod[];
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ProviderInfo as i, AuthHook as n, AuthMethod as r, AuthCredential as t };
|
|
46
|
+
//# sourceMappingURL=plugin-wK7RmJhZ.d.cts.map
|