{"version":3,"file":"openai-codex.mjs","names":[],"sources":["../../src/providers/openai-codex.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Client } from \"../core/client.ts\";\nimport {\n  AuthError,\n  EmptyQueryError,\n  HTTPError,\n  RateLimitError,\n  normalizeError,\n} from \"../core/errors.ts\";\nimport { operationSignal } from \"../core/execution.ts\";\nimport {\n  codexAuthSource,\n  environmentCodexCredentials,\n  hasEnvironmentCodexCredentials,\n  nativeCodexCredentials,\n  resolveCodexCredentials,\n  type ResolvedCodexCredentials,\n} from \"../core/codex-auth.ts\";\nimport { Provider } from \"../core/provider.ts\";\nimport { OPENAI_CODEX_MAX_RESULTS } from \"../core/providers.ts\";\nimport type {\n  CodexCredentials,\n  CodexCredentialProvider,\n  ProviderConfig,\n  SearchRequestOptions,\n  SearchResponse,\n  SearchResult,\n} from \"../core/types.ts\";\n\nconst BASE_URL = \"https://chatgpt.com/backend-api\";\nconst ENDPOINT = `${BASE_URL}/codex/responses`;\nconst DEFAULT_MODEL = \"gpt-5.5\";\nconst TIMEOUT_MS = 90_000;\nconst INSTRUCTIONS =\n  \"Search the web to answer the user's query. Cite your sources and keep the answer concise.\";\n\nconst sourceSchema = z\n  .object({\n    url: z.string().nullish(),\n    source_website_url: z.string().nullish(),\n    title: z.string().nullish(),\n    caption: z.string().nullish(),\n  })\n  .readonly();\nconst annotationSchema = z\n  .object({ type: z.string(), url: z.string().nullish(), title: z.string().nullish() })\n  .readonly();\nconst itemSchema = z\n  .object({\n    type: z.string(),\n    status: z.string().optional(),\n    action: z\n      .object({ sources: z.array(sourceSchema).readonly().optional() })\n      .readonly()\n      .optional(),\n    sources: z.array(sourceSchema).readonly().optional(),\n    results: z.array(sourceSchema).readonly().optional(),\n    content: z\n      .array(\n        z\n          .object({\n            type: z.string(),\n            text: z.string().optional(),\n            annotations: z.array(annotationSchema).readonly().optional(),\n          })\n          .readonly(),\n      )\n      .readonly()\n      .optional(),\n  })\n  .readonly();\nconst eventSchema = z\n  .object({\n    type: z.string(),\n    item: itemSchema.optional(),\n    response: z\n      .object({\n        id: z.string().optional(),\n        model: z.string().optional(),\n        status: z.string().optional(),\n        output: z.array(itemSchema).readonly().optional(),\n        error: z.unknown().optional(),\n        usage: z\n          .object({\n            input_tokens: z.number().nonnegative().optional(),\n            output_tokens: z.number().nonnegative().optional(),\n            total_tokens: z.number().nonnegative().optional(),\n          })\n          .readonly()\n          .nullish(),\n      })\n      .readonly()\n      .optional(),\n    code: z.string().optional(),\n    message: z.string().optional(),\n    error: z.unknown().optional(),\n  })\n  .readonly();\n\ntype CodexItem = z.infer<typeof itemSchema>;\ntype CodexEvent = z.infer<typeof eventSchema>;\n\nexport class OpenAICodexProvider extends Provider {\n  static readonly providerName = \"openai-codex\";\n  static readonly defaultBaseURL = BASE_URL;\n\n  readonly #credentials: CodexCredentials | CodexCredentialProvider;\n  readonly #model: string;\n  readonly #streamClient = new Client({ maxRetries: 0, timeout: TIMEOUT_MS });\n\n  constructor(config: Readonly<ProviderConfig>) {\n    super(config, OpenAICodexProvider);\n    if (this.baseURL !== BASE_URL) {\n      throw new AuthError(\n        \"Codex OAuth credentials may only use the official ChatGPT endpoint\",\n        \"openai-codex\",\n      );\n    }\n    const credentials = configuredCredentials(config);\n    this.#credentials =\n      typeof credentials === \"function\" ? credentials : resolveCodexCredentials(credentials);\n    this.#model = configuredModel(config);\n    if (!this.#model.trim()) throw new TypeError(\"Codex model must not be empty\");\n  }\n\n  async search(query: string, options?: SearchRequestOptions): Promise<SearchResult[]> {\n    return (await this.searchDetailed(query, options)).results;\n  }\n\n  async searchDetailed(query: string, options?: SearchRequestOptions): Promise<SearchResponse> {\n    const callerSignal = operationSignal(options);\n    const controller = new AbortController();\n    const timer = setTimeout(\n      () => controller.abort(new DOMException(\"Codex search timed out\", \"TimeoutError\")),\n      TIMEOUT_MS,\n    );\n    const signal = callerSignal\n      ? AbortSignal.any([callerSignal, controller.signal])\n      : controller.signal;\n    try {\n      signal.throwIfAborted();\n      if (!query.trim()) throw new EmptyQueryError();\n      const maxResults = resultLimit(options);\n      const summary = options?.summary === true;\n      const credentials = await this.resolveCredentials(false, signal);\n      try {\n        return await this.runSearch(query, credentials, maxResults, summary, signal);\n      } catch (error) {\n        signal.throwIfAborted();\n        if (!this.canRefresh(error)) throw error;\n        const refreshed = await this.resolveCredentials(true, signal);\n        if (\n          refreshed.accessToken === credentials.accessToken &&\n          refreshed.accountId === credentials.accountId\n        ) {\n          throw new AuthError(\n            \"Codex login was rejected and the credential resolver returned the same bearer and account. Sign in again with the owning client.\",\n            \"openai-codex\",\n          );\n        }\n        return await this.runSearch(query, refreshed, maxResults, summary, signal);\n      }\n    } catch (error) {\n      signal.throwIfAborted();\n      throw normalizeError(error, \"openai-codex\");\n    } finally {\n      clearTimeout(timer);\n      controller.abort();\n    }\n  }\n\n  private canRefresh(error: unknown): boolean {\n    return typeof this.#credentials === \"function\" && error instanceof AuthError;\n  }\n\n  private async resolveCredentials(\n    refresh: boolean,\n    signal: Readonly<AbortSignal>,\n  ): Promise<ResolvedCodexCredentials> {\n    signal.throwIfAborted();\n    if (typeof this.#credentials !== \"function\") return resolveCodexCredentials(this.#credentials);\n    try {\n      return resolveCodexCredentials(await awaitCredentials(this.#credentials, refresh, signal));\n    } catch {\n      signal.throwIfAborted();\n      throw new AuthError(\n        \"Codex credential provider failed; check your login or refresh handler\",\n        \"openai-codex\",\n      );\n    }\n  }\n\n  private async runSearch(\n    query: string,\n    credentials: ResolvedCodexCredentials,\n    maxResults: number,\n    summary: boolean,\n    signal: Readonly<AbortSignal>,\n  ): Promise<SearchResponse> {\n    const events = this.#streamClient.postSSE(\n      ENDPOINT,\n      {\n        model: this.#model,\n        stream: true,\n        store: false,\n        include: [\"web_search_call.action.sources\"],\n        instructions: INSTRUCTIONS,\n        input: [{ type: \"message\", role: \"user\", content: [{ type: \"input_text\", text: query }] }],\n        tools: [{ type: \"web_search\", search_context_size: \"high\" }],\n        tool_choice: { type: \"web_search\" },\n      },\n      {\n        Authorization: `Bearer ${credentials.accessToken}`,\n        \"chatgpt-account-id\": credentials.accountId,\n        \"OpenAI-Beta\": \"responses=experimental\",\n        originator: \"agntn-web\",\n      },\n      signal,\n    );\n    try {\n      return await collectSearch(events, this.#model, maxResults, summary);\n    } catch (error) {\n      signal.throwIfAborted();\n      throw normalizeError(error, \"openai-codex\");\n    }\n  }\n}\n\nfunction configuredCredentials(\n  config: Readonly<ProviderConfig>,\n): CodexCredentials | CodexCredentialProvider {\n  if (config.codex?.credentials !== undefined) return config.codex.credentials;\n  if (config.apiKey || hasEnvironmentCodexCredentials())\n    return environmentCodexCredentials(config.apiKey);\n  return nativeCodexCredentials(codexAuthSource(config.codex?.authSource));\n}\n\n/**\n * Stop waiting even if the caller's credential callback ignores cancellation.\n * @param provider - Credential owner.\n * @param refresh - Whether to replace rejected credentials.\n * @param signal - Search cancellation.\n * @returns {Promise<CodexCredentials>} Credentials for this attempt.\n */\nfunction awaitCredentials(\n  provider: CodexCredentialProvider,\n  refresh: boolean,\n  signal: Readonly<AbortSignal>,\n): Promise<CodexCredentials> {\n  return new Promise((resolve, reject) => {\n    const abort = (): void => reject(signal.reason);\n    signal.addEventListener(\"abort\", abort, { once: true });\n    Promise.resolve()\n      .then(() => {\n        signal.throwIfAborted();\n        return provider({ refresh, signal });\n      })\n      .then(resolve, reject)\n      .finally(() => signal.removeEventListener(\"abort\", abort));\n  });\n}\n\nfunction configuredModel(config: Readonly<ProviderConfig>): string {\n  return config.codex?.model ?? (process.env.OPENAI_CODEX_MODEL?.trim() || DEFAULT_MODEL);\n}\n\nfunction resultLimit(options?: SearchRequestOptions): number {\n  const limit = options?.maxResults ?? 10;\n  if (!Number.isInteger(limit) || limit < 1)\n    throw new TypeError(\"maxResults must be a positive integer\");\n  return Math.min(limit, OPENAI_CODEX_MAX_RESULTS);\n}\n\nasync function collectSearch(\n  events: Readonly<AsyncIterable<unknown>>,\n  requestedModel: string,\n  maxResults: number,\n  summary: boolean,\n): Promise<SearchResponse> {\n  const collector = new SearchCollector(summary);\n  for await (const rawEvent of events) {\n    const parsed = eventSchema.safeParse(rawEvent);\n    if (!parsed.success) throw protocolError(\"Malformed Codex event\");\n    if (collector.consume(parsed.data)) {\n      return collector.result(parsed.data.response, requestedModel, maxResults);\n    }\n  }\n  throw protocolError(\"Codex stream ended before completion\");\n}\n\nclass SearchCollector {\n  readonly #results = new Map<string, SearchResult>();\n  readonly #answer = new Set<string>();\n  readonly #summary: boolean;\n  #searched = false;\n\n  constructor(summary: boolean) {\n    this.#summary = summary;\n  }\n\n  consume(event: CodexEvent): boolean {\n    if (event.type === \"error\" || event.type === \"response.failed\") throw eventError(event);\n    if (event.type === \"response.incomplete\") throw protocolError(\"Codex response incomplete\");\n    if (event.type === \"response.web_search_call.completed\") this.#searched = true;\n    if (event.type === \"response.output_item.done\" && event.item) this.collectItem(event.item);\n    return event.type === \"response.completed\" || event.type === \"response.done\";\n  }\n\n  result(\n    response: CodexEvent[\"response\"],\n    requestedModel: string,\n    maxResults: number,\n  ): SearchResponse {\n    if (!response || incompleteStatus(response.status) || response.error) {\n      throw protocolError(\"Codex response did not complete\");\n    }\n    for (const item of response.output ?? []) this.collectItem(item);\n    if (!this.#searched) throw protocolError(\"Codex answered without running web search\");\n    const metadata = responseMetadata(response, requestedModel);\n    if (this.#summary && this.#answer.size > 0) metadata.answer = [...this.#answer].join(\"\\n\\n\");\n    return { results: [...this.#results.values()].slice(0, maxResults), metadata };\n  }\n\n  private collectItem(item: CodexItem): void {\n    if (item.type === \"web_search_call\") this.collectSources(item);\n    if (item.type === \"message\") this.collectMessage(item);\n  }\n\n  private collectSources(item: CodexItem): void {\n    if (incompleteStatus(item.status)) throw protocolError(\"Codex web search did not complete\");\n    this.#searched = true;\n    for (const source of [\n      ...(item.action?.sources ?? []),\n      ...(item.sources ?? []),\n      ...(item.results ?? []),\n    ]) {\n      this.addSource(source.url ?? source.source_website_url, source.title ?? source.caption);\n    }\n  }\n\n  private collectMessage(item: CodexItem): void {\n    for (const part of item.content ?? []) {\n      if (part.type !== \"output_text\") continue;\n      if (this.#summary && part.text) this.#answer.add(part.text);\n      for (const annotation of part.annotations ?? []) {\n        if (annotation.type === \"url_citation\") this.addSource(annotation.url, annotation.title);\n      }\n    }\n  }\n\n  /**\n   * Only structured sources count, not URLs invented in prose.\n   * @param sourceUrl - URL supplied by the hosted search tool or citation annotation.\n   * @param title - Source title when provided.\n   */\n  private addSource(sourceUrl?: string | null, title?: string | null): void {\n    const url = publicSourceUrl(sourceUrl);\n    if (!url) return;\n    const existing = this.#results.get(url);\n    if (!existing || (existing.title === url && title)) {\n      this.#results.set(url, { url, title: title || url, snippet: \"\" });\n    }\n  }\n}\n\nfunction incompleteStatus(status?: string): boolean {\n  return status !== undefined && status !== \"completed\";\n}\n\nfunction publicSourceUrl(value?: string | null): string | undefined {\n  if (!value) return undefined;\n  try {\n    const url = new URL(value);\n    if ((url.protocol !== \"https:\" && url.protocol !== \"http:\") || url.username || url.password)\n      return undefined;\n    return url.href;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction responseMetadata(\n  response: NonNullable<CodexEvent[\"response\"]>,\n  requestedModel: string,\n): Record<string, unknown> {\n  return {\n    model: response.model || requestedModel,\n    ...(response.id ? { requestId: response.id } : {}),\n    ...(response.usage ? { usage: usageMetadata(response.usage) } : {}),\n  };\n}\n\nfunction usageMetadata(\n  usage: NonNullable<NonNullable<CodexEvent[\"response\"]>[\"usage\"]>,\n): Record<string, number> {\n  return {\n    ...(usage.input_tokens === undefined ? {} : { inputTokens: usage.input_tokens }),\n    ...(usage.output_tokens === undefined ? {} : { outputTokens: usage.output_tokens }),\n    ...(usage.total_tokens === undefined ? {} : { totalTokens: usage.total_tokens }),\n  };\n}\n\nfunction eventError(event: Readonly<CodexEvent>): Error {\n  const errorSchema = z.object({ code: z.string().optional(), message: z.string().optional() });\n  const parts = [event, event.error, event.response?.error].flatMap((value) => {\n    const parsed = errorSchema.safeParse(value);\n    return parsed.success ? [parsed.data.code ?? \"\", parsed.data.message ?? \"\"] : [];\n  });\n  const detail = parts.join(\" \");\n  if (/rate[-_ ]?limit|quota|too many requests|\\b429\\b/iu.test(detail))\n    return new RateLimitError(60);\n  if (\n    /unauthori[sz]ed|authentication[_ ]error|invalid[_ ](?:access[_ ])?(?:token|api[_ ]key)|(?:token[_ ]expired|expired[_ ]token)|\\b401\\b/iu.test(\n      detail,\n    )\n  ) {\n    return new AuthError(\"Codex authentication expired or was rejected\", \"openai-codex\");\n  }\n  if (/forbidden|\\b403\\b/iu.test(detail))\n    return new HTTPError(403, ENDPOINT, \"Codex access denied\");\n  return protocolError(\"Codex request failed\");\n}\n\nfunction protocolError(message: string): HTTPError {\n  return new HTTPError(502, ENDPOINT, message);\n}\n"],"mappings":"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"}