{"version":3,"sources":["../../src/openai/index.ts","../../src/openai/openai.provider.ts","../../src/durable/types.ts","../../src/errors.ts","../../src/send-result.ts","../../src/types.ts","../../src/vault/local-vault.ts","../../src/openai/openai.transformer.ts","../../src/anthropic/tool-result.ts","../../src/openai/tool-result.ts","../../src/openai/openai-parser.ts","../../src/openai/sigv4-fetch.ts"],"sourcesContent":["export {\n  createOpenAIProvider,\n  mapError as mapOpenAIError,\n  type OpenAIProviderConfig,\n} from \"./openai.provider\";\nexport { openaiTransformer } from \"./openai.transformer\";\nexport {\n  mapEvent as mapOpenAIEvent,\n  ResponseAccumulator as OpenAIResponseAccumulator,\n} from \"./openai-parser\";\n","import OpenAI, { APIError, APIUserAbortError } from \"openai\";\nimport type {\n  ResponseCreateParamsStreaming,\n  ResponseInput,\n  ResponseStreamEvent,\n} from \"openai/resources/responses/responses\";\nimport type { CloudflareEdgeObserver } from \"../durable/cloudflare\";\nimport {\n  type DurabilityBackend,\n  type DurableBackend,\n  type EdgeObserver,\n  isEdgeObserver,\n  type SessionCheckpoint,\n} from \"../durable/types\";\nimport {\n  AbortedError,\n  ProviderAuthError,\n  ProviderRateLimitError,\n  ProviderResponseError,\n  ProviderUnavailableError,\n  ThalamusError,\n} from \"../errors\";\nimport { createSendResult } from \"../send-result\";\nimport {\n  type McpServerConfig,\n  OPENAI,\n  type Provider,\n  type RequestParams,\n  type Response,\n  type SendResult,\n  type SessionEventsFactory,\n  type SessionOptions,\n  type StreamingProvider,\n  type StreamPart,\n  type WebhookProvider,\n  type WebhookSendResult,\n} from \"../types\";\nimport { LocalVault } from \"../vault/local-vault\";\nimport type {\n  Credential,\n  Vault,\n  VaultOptions,\n  VaultStore,\n} from \"../vault/vault.interface\";\nimport { openaiTransformer } from \"./openai.transformer\";\nimport { mapEvent, ResponseAccumulator } from \"./openai-parser\";\nimport { createSigV4Fetch } from \"./sigv4-fetch\";\nimport { toOpenAIToolResultOutput } from \"./tool-result\";\n\nexport function mapError(error: unknown, provider: string): Error {\n  if (error instanceof APIUserAbortError) {\n    return new AbortedError({ provider, cause: error });\n  }\n\n  const msg = error instanceof Error ? error.message : String(error);\n  const code = error instanceof APIError ? (error.code ?? \"\") : \"\";\n  if (\n    code === \"invalid_api_key\" ||\n    msg.toLowerCase().includes(\"unauthorized\")\n  ) {\n    return new ProviderAuthError(msg, { provider, cause: error });\n  }\n  if (\n    code === \"rate_limit_exceeded\" ||\n    msg.toLowerCase().includes(\"rate limit\")\n  ) {\n    return new ProviderRateLimitError(msg, { provider, cause: error });\n  }\n  if (\n    msg.toLowerCase().includes(\"unavailable\") ||\n    msg.toLowerCase().includes(\"503\")\n  ) {\n    return new ProviderUnavailableError(msg, { provider, cause: error });\n  }\n  return new ProviderResponseError(msg, { provider, cause: error });\n}\n\n/**\n * SSE drops manifest as many error types (TypeError, ECONNRESET, socket hang up,\n * proxy timeouts, etc.) that can't be exhaustively listed. We invert the check:\n * only abort, application-level, and permanent API errors are terminal;\n * everything else is treated as a transient transport failure worth retrying.\n */\nfunction isTransientStreamError(err: unknown, signal?: AbortSignal): boolean {\n  if (signal?.aborted) return false;\n  if (err instanceof APIUserAbortError) return false;\n  if (err instanceof ThalamusError) return false;\n  if (err instanceof APIError && err.status >= 400 && err.status < 500) {\n    return false;\n  }\n  return true;\n}\n\ntype OpenAIDirectConfig = {\n  apiKey: string;\n  awsRegion?: never;\n  awsBedrockApiKey?: never;\n  awsCredentials?: never;\n};\n\ntype OpenAIBedrockApiKeyConfig = {\n  awsRegion: string;\n  awsBedrockApiKey: string;\n  apiKey?: never;\n  awsCredentials?: never;\n};\n\ntype OpenAIBedrockSigV4Config = {\n  awsRegion: string;\n  awsCredentials: {\n    accessKeyId: string;\n    secretAccessKey: string;\n    sessionToken?: string;\n  };\n  apiKey?: never;\n  awsBedrockApiKey?: never;\n};\n\ntype OpenAIBaseConfig = {\n  model?: string;\n  promptId?: string;\n  instructions?: string;\n  mcpServers?: McpServerConfig[];\n  vaultStore?: VaultStore;\n  onSessionEvents?: SessionEventsFactory;\n  durable?: DurableBackend;\n};\n\nfunction mapApprovalPolicy(policy: McpServerConfig[\"approvalPolicy\"]): unknown {\n  if (!policy || typeof policy === \"string\") return policy;\n  return { never: { tool_names: policy.except } };\n}\n\n// OpenAI SDK (v6.37) doesn't export MCP tool types yet — using untyped records\n// matching the wire format from https://developers.openai.com/docs/guides/tools-connectors-mcp\nfunction toMcpTools(\n  servers: McpServerConfig[],\n  credentials?: Map<string, Credential>,\n): Record<string, unknown>[] {\n  return servers.map((server) => {\n    const tool: Record<string, unknown> = {\n      type: \"mcp\",\n      server_label: server.name,\n      server_url: server.url,\n    };\n\n    // Vault credential takes priority over static server.authorization\n    const cred = credentials?.get(server.name);\n    if (cred) {\n      tool.authorization =\n        cred.type === \"bearer\" ? cred.token : cred.accessToken;\n    } else if (server.authorization) {\n      tool.authorization = server.authorization;\n    }\n\n    if (server.allowedTools) {\n      tool.allowed_tools = server.allowedTools;\n    }\n    if (server.approvalPolicy) {\n      tool.require_approval = mapApprovalPolicy(server.approvalPolicy);\n    }\n    return tool;\n  });\n}\n\nconst MAX_RECONNECT_RETRIES = 3;\n\nexport type OpenAIProviderConfig = OpenAIBaseConfig &\n  (OpenAIDirectConfig | OpenAIBedrockApiKeyConfig | OpenAIBedrockSigV4Config);\n\nfunction buildOpenAIClient(config: OpenAIProviderConfig): OpenAI {\n  if (!(\"awsRegion\" in config) || !config.awsRegion) {\n    return new OpenAI({ apiKey: config.apiKey });\n  }\n\n  const baseURL = `https://bedrock-mantle.${config.awsRegion}.api.aws/v1`;\n\n  if (\"awsBedrockApiKey\" in config && config.awsBedrockApiKey) {\n    return new OpenAI({ baseURL, apiKey: config.awsBedrockApiKey });\n  }\n\n  if (\"awsCredentials\" in config && config.awsCredentials) {\n    return new OpenAI({\n      baseURL,\n      apiKey: \"bedrock-sigv4\",\n      fetch: createSigV4Fetch({\n        region: config.awsRegion,\n        credentials: config.awsCredentials,\n      }),\n    });\n  }\n\n  return new OpenAI({ baseURL, apiKey: \"bedrock\" });\n}\n\nclass OpenAIProvider {\n  readonly provider = OPENAI;\n  readonly runtimeId: string;\n\n  private readonly client: OpenAI;\n  private readonly model: string;\n  private readonly instructions?: string;\n  private readonly useConversations: boolean;\n  private readonly mcpServers: McpServerConfig[];\n  private readonly vaultStore?: VaultStore;\n  private readonly onSessionEvents?: SessionEventsFactory;\n  private readonly config: OpenAIProviderConfig;\n\n  private get edgeObserver(): CloudflareEdgeObserver | null {\n    return this.config.durable && isEdgeObserver(this.config.durable)\n      ? (this.config.durable as CloudflareEdgeObserver)\n      : null;\n  }\n\n  private get checkpointBackend(): DurabilityBackend | null {\n    return this.config.durable && !isEdgeObserver(this.config.durable)\n      ? this.config.durable\n      : null;\n  }\n\n  constructor(config: OpenAIProviderConfig) {\n    this.config = config;\n    this.runtimeId = config.promptId ?? \"inline\";\n    this.model = config.model ?? \"gpt-4o\";\n    this.instructions = config.instructions;\n    this.client = buildOpenAIClient(config);\n    this.useConversations = !(\"awsRegion\" in config && config.awsRegion);\n    this.mcpServers = config.mcpServers ?? [];\n    this.vaultStore = config.vaultStore;\n    this.onSessionEvents = config.onSessionEvents;\n\n    if (\n      config.durable &&\n      config.onSessionEvents &&\n      !isEdgeObserver(config.durable)\n    ) {\n      this.recoverActiveSessions().catch(() => {});\n    }\n  }\n\n  send(params: RequestParams): SendResult | Promise<WebhookSendResult> {\n    const runId = crypto.randomUUID();\n    if (this.edgeObserver) {\n      return this.sendViaWebhook(params, runId);\n    }\n    const callbacks = this.onSessionEvents\n      ? this.onSessionEvents(params.sessionId ?? \"<<pending>>\", runId)\n      : undefined;\n    return createSendResult(this.runStream(params, runId), runId, callbacks, {\n      autoStart: !!this.onSessionEvents,\n    });\n  }\n\n  private async sendViaWebhook(\n    params: RequestParams,\n    runId: string,\n  ): Promise<WebhookSendResult> {\n    const sessionParams = await this.resolveSessionParams(params.sessionId);\n    const credentials = params.vaultIds?.length\n      ? await this.resolveCredentials(params.vaultIds)\n      : undefined;\n    const mcpTools =\n      this.mcpServers.length > 0\n        ? toMcpTools(this.mcpServers, credentials)\n        : undefined;\n    const sessionId = await this.edgeObserve(\n      params,\n      runId,\n      sessionParams,\n      mcpTools,\n    );\n    return { sessionId, runId };\n  }\n\n  private async resolveSessionParams(\n    sessionId?: string,\n  ): Promise<Record<string, unknown>> {\n    if (this.useConversations) {\n      const id = sessionId ?? (await this.client.conversations.create()).id;\n      return { conversation: { id } };\n    }\n    return sessionId ? { previous_response_id: sessionId } : {};\n  }\n\n  private buildInput(params: RequestParams): ResponseInput {\n    let input: ResponseInput = openaiTransformer.toInput(\n      params.messages,\n    ) as ResponseInput;\n\n    if (params.toolResults?.length) {\n      const toolInputs: ResponseInput = params.toolResults.map((tr) => {\n        if (tr.approved !== undefined) {\n          return {\n            type: \"mcp_approval_response\" as const,\n            approval_request_id: tr.toolUseId,\n            approve: tr.approved,\n          };\n        }\n        return {\n          type: \"function_call_output\" as const,\n          call_id: tr.toolUseId,\n          output: toOpenAIToolResultOutput(tr.content),\n        };\n      });\n      input = [...toolInputs, ...input];\n    }\n\n    return input;\n  }\n\n  private async *dispatchAndObserve(\n    params: RequestParams,\n    sessionParams: Record<string, unknown>,\n    mcpTools: Record<string, unknown>[] | undefined,\n    signal?: AbortSignal,\n  ): AsyncIterable<StreamPart> {\n    const input = this.buildInput(params);\n\n    const rawStream = await this.client.responses.create(\n      {\n        model: this.model,\n        input,\n        stream: true,\n        ...(this.instructions ? { instructions: this.instructions } : {}),\n        ...(mcpTools ? { tools: mcpTools } : {}),\n        ...sessionParams,\n        ...params.providerOptions,\n      } as ResponseCreateParamsStreaming,\n      { signal },\n    );\n\n    const acc = new ResponseAccumulator();\n    for await (const rawEvent of rawStream) {\n      yield* mapEvent(rawEvent, acc);\n    }\n\n    const response = acc.toResponse();\n    yield { type: \"finish\", response };\n  }\n\n  private async *resumeObservation(\n    responseId: string,\n    afterSequenceNumber: number,\n    signal?: AbortSignal,\n  ): AsyncIterable<ResponseStreamEvent> {\n    const rawStream = (await this.client.responses.retrieve(\n      responseId,\n      {\n        stream: true as const,\n        ...(afterSequenceNumber >= 0\n          ? { starting_after: afterSequenceNumber }\n          : {}),\n      },\n      { signal },\n    )) as AsyncIterable<ResponseStreamEvent>;\n\n    yield* rawStream;\n  }\n\n  private async getStatus(responseId: string): Promise<string | undefined> {\n    const response = await this.client.responses.retrieve(responseId);\n    return response.status;\n  }\n\n  /**\n   * Wraps dispatch+observe with auto-reconnect on transient network failures.\n   * OpenAI combines dispatch and observe in a single responses.create() call,\n   * so the first attempt dispatches; retries resume via responses.retrieve()\n   * with starting_after (cursor-based, no event duplication from the API).\n   *\n   * Dedup by sequence_number guards against overlapping events if the API\n   * sends a partial replay on resume.\n   */\n  private async *resilientDispatchAndObserve(\n    params: RequestParams,\n    runId: string,\n    sessionParams: Record<string, unknown>,\n    mcpTools: Record<string, unknown>[] | undefined,\n    signal?: AbortSignal,\n  ): AsyncIterable<StreamPart> {\n    const acc = new ResponseAccumulator();\n    const backend = this.checkpointBackend;\n    const input = this.buildInput(params);\n    let lastSequenceNumber = -1;\n    let responseId: string | undefined;\n    let retries = 0;\n\n    const createParams = {\n      model: this.model,\n      input,\n      ...(this.instructions ? { instructions: this.instructions } : {}),\n      ...(mcpTools ? { tools: mcpTools } : {}),\n      ...sessionParams,\n      ...params.providerOptions,\n    };\n\n    while (retries <= MAX_RECONNECT_RETRIES) {\n      try {\n        let rawStream: AsyncIterable<ResponseStreamEvent>;\n\n        if (responseId) {\n          rawStream = this.resumeObservation(\n            responseId,\n            lastSequenceNumber,\n            signal,\n          );\n        } else {\n          rawStream = await this.client.responses.create(\n            {\n              ...createParams,\n              stream: true,\n              ...(backend ? { background: true } : {}),\n            } as ResponseCreateParamsStreaming,\n            { signal },\n          );\n        }\n\n        for await (const rawEvent of rawStream) {\n          if (\n            \"sequence_number\" in rawEvent &&\n            typeof rawEvent.sequence_number === \"number\"\n          ) {\n            if (rawEvent.sequence_number <= lastSequenceNumber) continue;\n            lastSequenceNumber = rawEvent.sequence_number;\n          }\n          if (rawEvent.type === \"response.created\") {\n            responseId = rawEvent.response.id;\n          }\n          yield* mapEvent(rawEvent, acc);\n          if (backend && responseId) {\n            await backend.save({\n              sessionId: acc.sessionId ?? responseId,\n              provider: \"openai\",\n              lastEventId: String(lastSequenceNumber),\n              createdAt: Date.now(),\n              runId,\n              metadata: { responseId },\n            });\n          }\n        }\n\n        if (backend && responseId) {\n          await backend.remove(acc.sessionId ?? responseId);\n        }\n        yield { type: \"finish\", response: acc.toResponse() };\n        return;\n      } catch (err) {\n        if (!isTransientStreamError(err, signal)) throw err;\n        if (!responseId) throw err;\n\n        retries++;\n        if (retries > MAX_RECONNECT_RETRIES) throw err;\n      }\n    }\n  }\n\n  /**\n   * Recovers sessions that were active before a process restart.\n   * Fires onSessionEvents callbacks for missed events, then resumes live\n   * observation for sessions that are still running.\n   */\n  private async recoverActiveSessions(): Promise<void> {\n    const backend = this.checkpointBackend;\n    const { onSessionEvents } = this.config;\n    if (!backend || !onSessionEvents) return;\n\n    const active = await backend.getActive();\n\n    await Promise.allSettled(\n      active.map(async (checkpoint) => {\n        const responseId = checkpoint.metadata?.responseId;\n        if (!responseId) {\n          await backend.remove(checkpoint.sessionId);\n          return;\n        }\n\n        try {\n          const status = await this.getStatus(responseId);\n\n          if (\n            status === \"cancelled\" ||\n            status === \"failed\" ||\n            status === \"incomplete\"\n          ) {\n            await backend.remove(checkpoint.sessionId);\n            return;\n          }\n\n          const { runId } = checkpoint;\n          const callbacks = onSessionEvents(checkpoint.sessionId, runId);\n          const stream = this.recoverStream(checkpoint, runId, responseId);\n          const result = createSendResult(stream, runId, callbacks, {\n            autoStart: true,\n          });\n          result.response.catch(async (err) => {\n            console.error(\n              `[thalamus] recovery stream failed for ${checkpoint.sessionId}:`,\n              err instanceof Error ? err.message : err,\n            );\n            await backend.remove(checkpoint.sessionId).catch(() => {});\n          });\n        } catch (err) {\n          console.error(\n            `[thalamus] recovery failed for ${checkpoint.sessionId}:`,\n            err instanceof Error ? err.message : err,\n          );\n          await backend.remove(checkpoint.sessionId).catch(() => {});\n        }\n      }),\n    );\n  }\n\n  /**\n   * Generates a stream for a recovered session: resumes observation from the\n   * last known sequence number, deduplicates, and checkpoints as it goes.\n   * Requires the original response to have been created with `background: true`.\n   */\n  private async *recoverStream(\n    checkpoint: SessionCheckpoint,\n    runId: string,\n    responseId: string,\n  ): AsyncIterable<StreamPart> {\n    const { sessionId } = checkpoint;\n    const backend = this.checkpointBackend;\n    const acc = new ResponseAccumulator();\n    let lastSequenceNumber = Number(checkpoint.lastEventId) || -1;\n    let retries = 0;\n\n    yield { type: \"stream-start\", sessionId };\n\n    while (retries <= MAX_RECONNECT_RETRIES) {\n      try {\n        const rawStream = this.resumeObservation(\n          responseId,\n          lastSequenceNumber,\n        );\n\n        for await (const rawEvent of rawStream) {\n          if (\n            \"sequence_number\" in rawEvent &&\n            typeof rawEvent.sequence_number === \"number\"\n          ) {\n            if (rawEvent.sequence_number <= lastSequenceNumber) continue;\n            lastSequenceNumber = rawEvent.sequence_number;\n          }\n          yield* mapEvent(rawEvent, acc);\n          if (backend) {\n            await backend.save({\n              sessionId,\n              provider: \"openai\",\n              lastEventId: String(lastSequenceNumber),\n              createdAt: Date.now(),\n              runId,\n              metadata: { responseId },\n            });\n          }\n        }\n\n        if (backend) await backend.remove(sessionId);\n        yield { type: \"finish\", response: acc.toResponse() };\n        return;\n      } catch (err) {\n        if (!isTransientStreamError(err)) throw err;\n\n        retries++;\n        if (retries > MAX_RECONNECT_RETRIES) throw err;\n      }\n    }\n  }\n\n  private async edgeObserve(\n    params: RequestParams,\n    runId: string,\n    sessionParams: Record<string, unknown>,\n    mcpTools: Record<string, unknown>[] | undefined,\n  ): Promise<string> {\n    const observer = this.edgeObserver!;\n    const input = this.buildInput(params);\n\n    const initStream = await this.client.responses.create({\n      model: this.model,\n      input,\n      stream: true,\n      background: true,\n      ...(this.instructions ? { instructions: this.instructions } : {}),\n      ...(mcpTools ? { tools: mcpTools } : {}),\n      ...sessionParams,\n      ...params.providerOptions,\n    } as ResponseCreateParamsStreaming);\n\n    let responseId: string | undefined;\n    let lastSeqNo = -1;\n    for await (const event of initStream as AsyncIterable<ResponseStreamEvent>) {\n      if (\n        \"sequence_number\" in event &&\n        typeof event.sequence_number === \"number\"\n      ) {\n        lastSeqNo = event.sequence_number;\n      }\n      if (event.type === \"response.created\") {\n        responseId = event.response.id;\n        break;\n      }\n    }\n\n    if (!responseId) {\n      throw new ThalamusError(\n        \"edge observe: no responseId from initial stream\",\n        { provider: OPENAI, isRetryable: false },\n      );\n    }\n\n    const startingAfter = lastSeqNo >= 0 ? `&starting_after=${lastSeqNo}` : \"\";\n    await observer.observe({\n      sessionId: responseId,\n      runId,\n      streamUrl: `${this.client.baseURL}/responses/${responseId}?stream=true${startingAfter}`,\n      headers: {\n        Authorization: `Bearer ${this.client.apiKey}`,\n      },\n      provider: \"openai\",\n      webhook: {\n        ...observer.webhook,\n        metadata: params.webhookMetadata,\n      },\n    });\n\n    return responseId;\n  }\n\n  private async *runStream(\n    params: RequestParams,\n    runId: string,\n  ): AsyncIterable<StreamPart> {\n    try {\n      const sessionParams = await this.resolveSessionParams(params.sessionId);\n\n      const credentials = params.vaultIds?.length\n        ? await this.resolveCredentials(params.vaultIds)\n        : undefined;\n\n      const mcpTools =\n        this.mcpServers.length > 0\n          ? toMcpTools(this.mcpServers, credentials)\n          : undefined;\n\n      const signal = params.abortSignal ?? undefined;\n\n      yield* this.resilientDispatchAndObserve(\n        params,\n        runId,\n        sessionParams,\n        mcpTools,\n        signal,\n      );\n    } catch (err) {\n      const mapped =\n        err instanceof ThalamusError ? err : (mapError(err, OPENAI) as Error);\n      yield { type: \"error\", error: mapped };\n    }\n  }\n\n  async createVault(options: VaultOptions): Promise<Vault> {\n    if (!this.vaultStore) {\n      throw new ThalamusError(\n        \"Pass a vaultStore to createOpenAIProvider() to use vault operations\",\n        {\n          provider: OPENAI,\n          isRetryable: false,\n        },\n      );\n    }\n    const record = await this.vaultStore.createVault(options);\n    return new LocalVault(record.id, OPENAI, this.vaultStore);\n  }\n\n  async getVault(vaultId: string): Promise<Vault> {\n    if (!this.vaultStore) {\n      throw new ThalamusError(\n        \"vaultStore is required for OpenAI vault support\",\n        {\n          provider: OPENAI,\n          isRetryable: false,\n        },\n      );\n    }\n    const record = await this.vaultStore.getVault(vaultId);\n    if (!record) {\n      throw new ThalamusError(`Vault not found: ${vaultId}`, {\n        provider: OPENAI,\n        isRetryable: false,\n      });\n    }\n    return new LocalVault(record.id, OPENAI, this.vaultStore);\n  }\n\n  private async resolveCredentials(\n    vaultIds: string[],\n  ): Promise<Map<string, Credential>> {\n    if (!this.vaultStore) {\n      throw new ThalamusError(\n        \"vaultStore is required to resolve vault credentials\",\n        { provider: OPENAI, isRetryable: false },\n      );\n    }\n    const merged = new Map<string, Credential>();\n    for (const vid of vaultIds) {\n      const stored = await this.vaultStore.getAll(vid);\n      for (const s of stored) {\n        if (!merged.has(s.name)) {\n          merged.set(s.name, s.credential);\n        }\n      }\n    }\n    return merged;\n  }\n\n  async createSession(_options?: SessionOptions): Promise<string> {\n    return crypto.randomUUID();\n  }\n\n  async endSession(_sessionId: string): Promise<void> {\n    // No-op for stateless provider.\n  }\n}\n\nexport function createOpenAIProvider(\n  config: OpenAIProviderConfig & { durable: EdgeObserver },\n): WebhookProvider;\nexport function createOpenAIProvider(\n  config: OpenAIProviderConfig,\n): StreamingProvider;\nexport function createOpenAIProvider(\n  config: OpenAIProviderConfig,\n): StreamingProvider | WebhookProvider {\n  return new OpenAIProvider(config) as StreamingProvider | WebhookProvider;\n}\n","export interface SessionCheckpoint {\n  sessionId: string;\n  provider: string;\n  lastEventId: string;\n  createdAt: number;\n  runId: string;\n  metadata?: Record<string, string>;\n}\n\n/** Checkpoint-based durability — stores event cursors in an external store. */\nexport interface DurabilityBackend {\n  save(checkpoint: SessionCheckpoint): Promise<void>;\n  remove(sessionId: string): Promise<void>;\n  getActive(): Promise<SessionCheckpoint[]>;\n}\n\n/* ------------------------------------------------------------------ */\n/*  Edge observer — holds SSE connections at the edge on behalf of     */\n/*  the application (e.g. Cloudflare Durable Objects).                 */\n/* ------------------------------------------------------------------ */\n\nexport interface EdgeObserveParams {\n  sessionId: string;\n  /** Unique identifier for this `send()` invocation. Forwarded in every webhook event. */\n  runId: string;\n  streamUrl: string;\n  headers: Record<string, string>;\n  provider: string;\n  webhook: {\n    url: string;\n    secret: string;\n    metadata?: Record<string, string>;\n  };\n}\n\n/** Edge-proxy durability — SSE lives outside the consumer process, events delivered via webhook. */\nexport interface EdgeObserver {\n  observe(params: EdgeObserveParams): Promise<void>;\n  stop(sessionId: string): Promise<void>;\n}\n\n/* ------------------------------------------------------------------ */\n/*  Unified type                                                       */\n/* ------------------------------------------------------------------ */\n\nexport type DurableBackend = DurabilityBackend | EdgeObserver;\n\nexport function isEdgeObserver(\n  backend: DurableBackend,\n): backend is EdgeObserver {\n  return \"observe\" in backend && \"stop\" in backend && !(\"save\" in backend);\n}\n","export class ThalamusError extends Error {\n  readonly provider: string;\n  readonly isRetryable: boolean;\n  override readonly cause?: unknown;\n\n  constructor(\n    message: string,\n    options: { provider: string; isRetryable: boolean; cause?: unknown },\n  ) {\n    super(message, { cause: options.cause });\n    this.name = \"ThalamusError\";\n    this.provider = options.provider;\n    this.isRetryable = options.isRetryable;\n    this.cause = options.cause;\n  }\n}\n\nexport class ProviderAuthError extends ThalamusError {\n  constructor(message: string, options: { provider: string; cause?: unknown }) {\n    super(message, { ...options, isRetryable: false });\n    this.name = \"ProviderAuthError\";\n  }\n}\n\nexport class ProviderRateLimitError extends ThalamusError {\n  readonly retryAfterMs?: number;\n\n  constructor(\n    message: string,\n    options: { provider: string; retryAfterMs?: number; cause?: unknown },\n  ) {\n    super(message, { ...options, isRetryable: true });\n    this.name = \"ProviderRateLimitError\";\n    this.retryAfterMs = options.retryAfterMs;\n  }\n}\n\nexport class ProviderUnavailableError extends ThalamusError {\n  constructor(message: string, options: { provider: string; cause?: unknown }) {\n    super(message, { ...options, isRetryable: true });\n    this.name = \"ProviderUnavailableError\";\n  }\n}\n\nexport class ProviderResponseError extends ThalamusError {\n  constructor(message: string, options: { provider: string; cause?: unknown }) {\n    super(message, { ...options, isRetryable: false });\n    this.name = \"ProviderResponseError\";\n  }\n}\n\nexport class SessionExpiredError extends ThalamusError {\n  readonly sessionId: string;\n\n  constructor(\n    message: string,\n    options: { provider: string; sessionId: string; cause?: unknown },\n  ) {\n    super(message, { ...options, isRetryable: true });\n    this.name = \"SessionExpiredError\";\n    this.sessionId = options.sessionId;\n  }\n}\n\nexport class VaultError extends ThalamusError {\n  constructor(message: string, options: { provider: string; cause?: unknown }) {\n    super(message, { ...options, isRetryable: false });\n    this.name = \"VaultError\";\n  }\n}\n\nexport class VaultNotFoundError extends VaultError {\n  readonly vaultId: string;\n\n  constructor(vaultId: string, options: { provider: string; cause?: unknown }) {\n    super(`Vault ${vaultId} not found`, options);\n    this.name = \"VaultNotFoundError\";\n    this.vaultId = vaultId;\n  }\n}\n\nexport class CredentialExpiredError extends VaultError {\n  readonly serverName: string;\n  readonly vaultId: string;\n\n  constructor(\n    serverName: string,\n    vaultId: string,\n    options: { provider: string; cause?: unknown },\n  ) {\n    super(\n      `Credential for ${serverName} in vault ${vaultId} is expired with no refresh config`,\n      options,\n    );\n    this.name = \"CredentialExpiredError\";\n    this.serverName = serverName;\n    this.vaultId = vaultId;\n  }\n}\n\nexport class AbortedError extends ThalamusError {\n  readonly sessionId?: string;\n\n  constructor(options: {\n    provider: string;\n    sessionId?: string;\n    cause?: unknown;\n  }) {\n    super(\"Operation aborted\", { ...options, isRetryable: false });\n    this.name = \"AbortedError\";\n    this.sessionId = options.sessionId;\n  }\n}\n\nexport class McpServerError extends ThalamusError {\n  readonly serverName: string;\n  readonly statusCode?: number;\n\n  constructor(\n    serverName: string,\n    options: { provider: string; statusCode?: number; cause?: unknown },\n  ) {\n    const retryable =\n      options.statusCode !== undefined && options.statusCode >= 500;\n    super(\n      `MCP server ${serverName} error${options.statusCode ? ` (${options.statusCode})` : \"\"}`,\n      { ...options, isRetryable: retryable },\n    );\n    this.name = \"McpServerError\";\n    this.serverName = serverName;\n    this.statusCode = options.statusCode;\n  }\n}\n","import type {\n  Response,\n  SendResult,\n  StreamCallbacks,\n  StreamPart,\n} from \"./types\";\n\nexport const CALLBACK_MAP: Record<StreamPart[\"type\"], keyof StreamCallbacks> = {\n  \"text-delta\": \"onTextDelta\",\n  thinking: \"onThinking\",\n  refusal: \"onRefusal\",\n  \"tool-use-start\": \"onToolUseStart\",\n  \"tool-use-delta\": \"onToolUseDelta\",\n  \"tool-use-done\": \"onToolUseDone\",\n  \"tool-use-result\": \"onToolUseResult\",\n  \"mcp-tools-discovered\": \"onMcpToolsDiscovered\",\n  \"step-start\": \"onStepStart\",\n  \"step-done\": \"onStepDone\",\n  \"status-change\": \"onStatusChange\",\n  \"stream-start\": \"onStreamStart\",\n  finish: \"onFinish\",\n  error: \"onError\",\n  \"provider-event\": \"onProviderEvent\",\n};\n\nexport interface SendResultOptions {\n  autoStart?: boolean;\n}\n\nclass SendResultImpl implements SendResult {\n  private _promise: Promise<Response> | null = null;\n  private _sessionIdResolve!: (id: string) => void;\n  private readonly _sessionId: Promise<string>;\n\n  constructor(\n    private readonly source: AsyncIterable<StreamPart>,\n    readonly runId: string,\n    private readonly callbacks?: StreamCallbacks,\n    options?: SendResultOptions,\n  ) {\n    this._sessionId = new Promise<string>((resolve) => {\n      this._sessionIdResolve = resolve;\n    });\n\n    if (options?.autoStart) {\n      this._promise = this.run();\n    }\n  }\n\n  get sessionId(): Promise<string> {\n    this._promise ??= this.run();\n    return this._sessionId;\n  }\n\n  get response(): Promise<Response> {\n    this._promise ??= this.run();\n    return this._promise;\n  }\n\n  // biome-ignore lint/suspicious/noThenProperty: intentional PromiseLike implementation\n  then<TResult1 = Response, TResult2 = never>(\n    onfulfilled?:\n      | ((value: Response) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.response.then(onfulfilled, onrejected);\n  }\n\n  async text(): Promise<string> {\n    return (await this.response).content;\n  }\n\n  private async run(): Promise<Response> {\n    for await (const part of this.source) {\n      if (part.type === \"stream-start\" && part.sessionId) {\n        this._sessionIdResolve(part.sessionId);\n      }\n      await this.dispatch(part);\n      if (part.type === \"finish\") return part.response;\n      if (part.type === \"error\") throw part.error;\n    }\n    throw new Error(\"Stream ended without a finish event\");\n  }\n\n  private async dispatch(part: StreamPart): Promise<void> {\n    if (!this.callbacks) return;\n    await this.callbacks.onPart?.(part);\n    const key = CALLBACK_MAP[part.type];\n    const cb = this.callbacks[key] as\n      | ((part: StreamPart) => void | Promise<void>)\n      | undefined;\n    if (cb) await cb(part);\n  }\n}\n\nexport function createSendResult(\n  source: AsyncIterable<StreamPart>,\n  runId: string,\n  callbacks?: StreamCallbacks,\n  options?: SendResultOptions,\n): SendResult {\n  return new SendResultImpl(source, runId, callbacks, options);\n}\n","import type { Vault, VaultOptions } from \"./vault/vault.interface\";\n\nexport enum MessageRole {\n  USER = \"user\",\n  ASSISTANT = \"assistant\",\n  SYSTEM = \"system\",\n}\n\nexport type ContentPart =\n  | { type: \"text\"; text: string }\n  | { type: \"image\"; data: string; mediaType: string }\n  | { type: \"image-url\"; url: string }\n  | { type: \"file\"; data: string; mediaType: string; name?: string };\n\nexport interface Message {\n  role: MessageRole;\n  content: string | ContentPart[];\n}\n\n/** Normalized tool output; provider parsers map into this shape. */\nexport type ToolResultContent =\n  | { type: \"text\"; text: string }\n  | {\n      type: \"citation\";\n      url: string;\n      title?: string;\n      excerpts?: string[];\n    }\n  | { type: \"json\"; value: unknown }\n  | {\n      type: \"media\";\n      mediaType: string;\n      data: string;\n      name?: string;\n    }\n  | {\n      type: \"unknown\";\n      providerType: string;\n      data: Record<string, unknown>;\n    };\n\nexport interface ToolResult {\n  toolUseId: string;\n  content: ToolResultContent[];\n  isError?: boolean;\n  approved?: boolean;\n}\n\nexport interface RequestParams {\n  /** Messages for this turn. May include system, user, and assistant messages. */\n  messages: Message[];\n  /** Opaque session identifier returned by a prior response. Absent means start a new session. */\n  sessionId?: string;\n  /** Vault IDs to bind to this request (credentials available to MCP servers). */\n  vaultIds?: string[];\n  /** Approval responses or tool outputs from a previous requires-action turn. */\n  toolResults?: ToolResult[];\n  /** Pass-through options forwarded directly to the underlying provider SDK call. */\n  providerOptions?: Record<string, unknown>;\n  /** When fired, the SDK closes the connection and the operation yields an `AbortedError`. */\n  abortSignal?: AbortSignal;\n  /** Metadata forwarded in the webhook payload for routing/context on the receiving end. */\n  webhookMetadata?: Record<string, string>;\n}\n\nexport interface SessionOptions {\n  vaultIds?: string[];\n  providerOptions?: Record<string, unknown>;\n}\n\nexport interface Usage {\n  inputTokens?: number;\n  outputTokens?: number;\n  totalTokens?: number;\n}\n\nexport type ToolSource =\n  | { type: \"builtin\" }\n  | { type: \"custom\" }\n  | { type: \"mcp\"; serverName: string };\n\nexport type McpApprovalPolicy = \"always\" | \"never\" | { except: string[] };\n\nexport interface McpServerConfig {\n  name: string;\n  url: string;\n  authorization?: string;\n  allowedTools?: string[];\n  approvalPolicy?: McpApprovalPolicy;\n}\n\nexport interface McpToolDef {\n  name: string;\n  description?: string;\n  inputSchema?: Record<string, unknown>;\n}\n\nexport type ActionRequired =\n  | {\n      type: \"tool-confirmation\";\n      toolUseId: string;\n      toolName: string;\n      input?: Record<string, unknown>;\n    }\n  | {\n      type: \"mcp-approval\";\n      toolUseId: string;\n      toolName: string;\n      serverName: string;\n      input?: Record<string, unknown>;\n    };\n\nexport interface Response {\n  content: string;\n  /** Session identifier to pass as `sessionId` on the next turn to continue the conversation. */\n  sessionId?: string;\n  finishReason:\n    | \"stop\"\n    | \"length\"\n    | \"error\"\n    | \"requires-action\"\n    | \"refused\"\n    | \"other\";\n  usage?: Usage;\n  actionsRequired?: ActionRequired[];\n}\n\nexport type AgentStatus = \"running\" | \"queued\" | \"retrying\" | \"idle\";\n\nexport type StreamPart =\n  | { type: \"text-delta\"; text: string }\n  | { type: \"refusal\"; text: string }\n  | { type: \"thinking\"; text: string }\n  | {\n      type: \"tool-use-start\";\n      toolName: string;\n      toolUseId: string;\n      source?: ToolSource;\n    }\n  | { type: \"tool-use-delta\"; toolUseId: string; argumentsDelta: string }\n  | {\n      type: \"tool-use-done\";\n      toolName: string;\n      toolUseId: string;\n      input?: Record<string, unknown>;\n      source?: ToolSource;\n    }\n  | {\n      type: \"tool-use-result\";\n      toolUseId: string;\n      content: ToolResultContent[];\n      isError?: boolean;\n      source?: ToolSource;\n    }\n  | {\n      type: \"mcp-tools-discovered\";\n      serverName: string;\n      tools: McpToolDef[];\n    }\n  | { type: \"step-start\"; stepIndex: number }\n  | { type: \"step-done\"; stepIndex: number }\n  | { type: \"status-change\"; status: AgentStatus }\n  | { type: \"stream-start\"; sessionId?: string }\n  | { type: \"finish\"; response: Response }\n  | { type: \"error\"; error: Error }\n  | {\n      type: \"provider-event\";\n      provider: string;\n      event: string;\n      data: Record<string, unknown>;\n    };\n\nexport interface StreamCallbacks {\n  /** Fires for every stream part, before type-specific callbacks. */\n  onPart?: (part: StreamPart) => void | Promise<void>;\n  onTextDelta?: (\n    part: Extract<StreamPart, { type: \"text-delta\" }>,\n  ) => void | Promise<void>;\n  onThinking?: (\n    part: Extract<StreamPart, { type: \"thinking\" }>,\n  ) => void | Promise<void>;\n  onRefusal?: (\n    part: Extract<StreamPart, { type: \"refusal\" }>,\n  ) => void | Promise<void>;\n  onToolUseStart?: (\n    part: Extract<StreamPart, { type: \"tool-use-start\" }>,\n  ) => void | Promise<void>;\n  onToolUseDelta?: (\n    part: Extract<StreamPart, { type: \"tool-use-delta\" }>,\n  ) => void | Promise<void>;\n  onToolUseDone?: (\n    part: Extract<StreamPart, { type: \"tool-use-done\" }>,\n  ) => void | Promise<void>;\n  onToolUseResult?: (\n    part: Extract<StreamPart, { type: \"tool-use-result\" }>,\n  ) => void | Promise<void>;\n  onMcpToolsDiscovered?: (\n    part: Extract<StreamPart, { type: \"mcp-tools-discovered\" }>,\n  ) => void | Promise<void>;\n  onStepStart?: (\n    part: Extract<StreamPart, { type: \"step-start\" }>,\n  ) => void | Promise<void>;\n  onStepDone?: (\n    part: Extract<StreamPart, { type: \"step-done\" }>,\n  ) => void | Promise<void>;\n  onStatusChange?: (\n    part: Extract<StreamPart, { type: \"status-change\" }>,\n  ) => void | Promise<void>;\n  onStreamStart?: (\n    part: Extract<StreamPart, { type: \"stream-start\" }>,\n  ) => void | Promise<void>;\n  onFinish?: (\n    part: Extract<StreamPart, { type: \"finish\" }>,\n  ) => void | Promise<void>;\n  onError?: (\n    part: Extract<StreamPart, { type: \"error\" }>,\n  ) => void | Promise<void>;\n  onProviderEvent?: (\n    part: Extract<StreamPart, { type: \"provider-event\" }>,\n  ) => void | Promise<void>;\n}\n\nexport interface SendResult extends PromiseLike<Response> {\n  /** Unique identifier for this `send()` invocation. Known synchronously. */\n  readonly runId: string;\n  readonly sessionId: Promise<string>;\n  readonly response: Promise<Response>;\n  text(): Promise<string>;\n}\n\nexport interface WebhookSendResult {\n  sessionId: string;\n  /** Unique identifier for this `send()` invocation, also present in every webhook event. */\n  runId: string;\n}\n\nexport type SessionEventsFactory = (\n  sessionId: string,\n  runId: string,\n) => StreamCallbacks;\n\ninterface BaseProvider {\n  readonly provider: string;\n  readonly runtimeId: string;\n  createVault(options: VaultOptions): Promise<Vault>;\n  getVault(vaultId: string): Promise<Vault>;\n  createSession(options?: SessionOptions): Promise<string>;\n  endSession(sessionId: string): Promise<void>;\n}\n\nexport interface StreamingProvider extends BaseProvider {\n  send(params: RequestParams): SendResult;\n}\n\nexport interface WebhookProvider extends BaseProvider {\n  send(params: RequestParams): Promise<WebhookSendResult>;\n}\n\nexport type Provider = StreamingProvider | WebhookProvider;\n\nexport const ANTHROPIC = \"anthropic\" as const;\nexport const OPENAI = \"openai\" as const;\n","import type {\n  Credential,\n  CredentialInfo,\n  Vault,\n  VaultStore,\n} from \"./vault.interface\";\n\nexport class LocalVault implements Vault {\n  readonly id: string;\n  readonly provider: string;\n  private readonly store: VaultStore;\n\n  constructor(id: string, provider: string, store: VaultStore) {\n    this.id = id;\n    this.provider = provider;\n    this.store = store;\n  }\n\n  async add(name: string, credential: Credential): Promise<void> {\n    await this.store.set(this.id, name, credential);\n  }\n\n  async update(name: string, credential: Credential): Promise<void> {\n    await this.store.set(this.id, name, credential);\n  }\n\n  async remove(name: string): Promise<void> {\n    await this.store.remove(this.id, name);\n  }\n\n  async list(): Promise<CredentialInfo[]> {\n    const all = await this.store.getAll(this.id);\n    return all.map((c) => ({\n      name: c.name,\n      type: c.type,\n      status: c.status,\n      expiresAt: c.expiresAt,\n      createdAt: c.createdAt,\n      updatedAt: c.updatedAt,\n    }));\n  }\n\n  async destroy(): Promise<void> {\n    await this.store.removeVault(this.id);\n  }\n}\n","import { type Message, MessageRole } from \"../types\";\n\ntype OpenAIInputContent =\n  | { type: \"input_text\"; text: string }\n  | { type: \"input_image\"; image_url: string }\n  | { type: \"input_file\"; file_data: string; filename?: string };\n\ntype OpenAIInputMessage = {\n  role: \"user\" | \"system\" | \"assistant\";\n  content: string | OpenAIInputContent[];\n};\n\nexport const openaiTransformer = {\n  toInput(messages: Message[]): OpenAIInputMessage[] {\n    return messages.map((msg) => {\n      const role =\n        msg.role === MessageRole.USER\n          ? \"user\"\n          : msg.role === MessageRole.SYSTEM\n            ? \"system\"\n            : \"assistant\";\n\n      if (typeof msg.content === \"string\")\n        return { role, content: msg.content } as OpenAIInputMessage;\n\n      const parts: OpenAIInputContent[] = [];\n      for (const part of msg.content) {\n        switch (part.type) {\n          case \"text\":\n            parts.push({ type: \"input_text\", text: part.text });\n            break;\n          case \"image-url\":\n            parts.push({ type: \"input_image\", image_url: part.url });\n            break;\n          case \"image\":\n            parts.push({\n              type: \"input_image\",\n              image_url: `data:${part.mediaType};base64,${part.data}`,\n            });\n            break;\n          case \"file\":\n            parts.push({\n              type: \"input_file\",\n              file_data: `data:${part.mediaType};base64,${part.data}`,\n              ...(part.name ? { filename: part.name } : {}),\n            });\n            break;\n        }\n      }\n\n      return { role, content: parts } as OpenAIInputMessage;\n    });\n  },\n};\n","import type {\n  BetaManagedAgentsAgentMCPToolResultEvent,\n  BetaManagedAgentsAgentToolResultEvent,\n  BetaManagedAgentsDocumentBlock,\n  BetaManagedAgentsImageBlock,\n  BetaManagedAgentsTextBlock,\n} from \"@anthropic-ai/sdk/resources/beta/sessions\";\nimport type { ToolResultContent } from \"../types\";\n\n/** Content block on `agent.tool_result` / `agent.mcp_tool_result` (SDK 0.98+). */\nexport type AnthropicToolResultContentBlock = NonNullable<\n  BetaManagedAgentsAgentToolResultEvent[\"content\"]\n>[number];\n\nfunction mapImageBlock(block: BetaManagedAgentsImageBlock): ToolResultContent {\n  const { source } = block;\n  if (source.type === \"base64\") {\n    return {\n      type: \"media\",\n      mediaType: source.media_type,\n      data: source.data,\n    };\n  }\n  if (source.type === \"url\") {\n    return {\n      type: \"media\",\n      mediaType: \"image/*\",\n      data: source.url,\n      name: source.url,\n    };\n  }\n  return {\n    type: \"unknown\",\n    providerType: \"image\",\n    data: block as unknown as Record<string, unknown>,\n  };\n}\n\nfunction mapDocumentBlock(\n  block: BetaManagedAgentsDocumentBlock,\n): ToolResultContent {\n  const { source } = block;\n  if (source.type === \"base64\") {\n    return {\n      type: \"media\",\n      mediaType: source.media_type,\n      data: source.data,\n      name: block.title ?? undefined,\n    };\n  }\n  if (source.type === \"text\") {\n    return { type: \"text\", text: source.data };\n  }\n  if (source.type === \"url\") {\n    return {\n      type: \"media\",\n      mediaType: \"application/octet-stream\",\n      data: source.url,\n      name: block.title ?? source.url,\n    };\n  }\n  return {\n    type: \"unknown\",\n    providerType: \"document\",\n    data: block as unknown as Record<string, unknown>,\n  };\n}\n\nexport function parseAnthropicToolResultContent(\n  blocks: readonly AnthropicToolResultContentBlock[] | null | undefined,\n): ToolResultContent[] {\n  if (!blocks?.length) return [];\n\n  return blocks.flatMap((block): ToolResultContent[] => {\n    switch (block.type) {\n      case \"text\":\n        return [{ type: \"text\", text: block.text }];\n      case \"search_result\": {\n        const excerpts = block.content.map((c) => c.text).filter(Boolean);\n        return [\n          {\n            type: \"citation\",\n            url: block.source,\n            title: block.title,\n            excerpts: excerpts.length > 0 ? excerpts : undefined,\n          },\n        ];\n      }\n      case \"image\":\n        return [mapImageBlock(block)];\n      case \"document\":\n        return [mapDocumentBlock(block)];\n      default:\n        return [\n          {\n            type: \"unknown\",\n            providerType: (block as { type: string }).type,\n            data: block as unknown as Record<string, unknown>,\n          },\n        ];\n    }\n  });\n}\n\nexport function toolResultFromAgentToolResultEvent(\n  event: Pick<\n    BetaManagedAgentsAgentToolResultEvent,\n    \"content\" | \"is_error\" | \"tool_use_id\"\n  >,\n): { content: ToolResultContent[]; isError?: boolean } {\n  return {\n    content: parseAnthropicToolResultContent(event.content),\n    isError: event.is_error ? true : undefined,\n  };\n}\n\nexport function toolResultFromMcpToolResultEvent(\n  event: Pick<\n    BetaManagedAgentsAgentMCPToolResultEvent,\n    \"content\" | \"is_error\" | \"mcp_tool_use_id\"\n  >,\n): { content: ToolResultContent[]; isError?: boolean } {\n  return {\n    content: parseAnthropicToolResultContent(event.content),\n    isError: event.is_error ? true : undefined,\n  };\n}\n\n/** Thalamus {@link ToolResultContent} → plain string for provider APIs that only accept text. */\nexport function flattenToolResultText(content: ToolResultContent[]): string {\n  const parts: string[] = [];\n  for (const block of content) {\n    switch (block.type) {\n      case \"text\":\n        if (block.text) parts.push(block.text);\n        break;\n      case \"citation\": {\n        const head = block.title\n          ? block.url\n            ? `[${block.title}](${block.url})`\n            : block.title\n          : block.url;\n        const excerpt = block.excerpts?.[0];\n        parts.push(excerpt ? `${head}: ${excerpt}` : head);\n        break;\n      }\n      case \"json\":\n        parts.push(JSON.stringify(block.value));\n        break;\n      case \"media\":\n        parts.push(block.name ?? `[${block.mediaType}]`);\n        break;\n      case \"unknown\":\n        parts.push(JSON.stringify(block.data));\n        break;\n    }\n  }\n  return parts.join(\"\\n\\n\");\n}\n\n/** Map unified content back for `user.custom_tool_result`. */\nexport function toAnthropicToolResultContent(\n  content: ToolResultContent[],\n): BetaManagedAgentsTextBlock[] {\n  return [{ type: \"text\", text: flattenToolResultText(content) }];\n}\n","import { flattenToolResultText } from \"../anthropic/tool-result\";\nimport type { ToolResultContent } from \"../types\";\n\nexport function parseOpenAIToolResultOutput(\n  output: string | null | undefined,\n): ToolResultContent[] {\n  if (output == null || output === \"\") return [];\n  return [{ type: \"text\", text: output }];\n}\n\nexport function toOpenAIToolResultOutput(content: ToolResultContent[]): string {\n  return flattenToolResultText(content);\n}\n","import type {\n  ResponseMcpCallArgumentsDeltaEvent,\n  ResponseOutputItem,\n  ResponseOutputItemAddedEvent,\n  ResponseOutputItemDoneEvent,\n  ResponseStreamEvent,\n} from \"openai/resources/responses/responses\";\nimport {\n  ProviderAuthError,\n  ProviderRateLimitError,\n  ProviderResponseError,\n  ProviderUnavailableError,\n  ThalamusError,\n} from \"../errors\";\nimport {\n  type ActionRequired,\n  OPENAI,\n  type Response,\n  type StreamPart,\n  type Usage,\n} from \"../types\";\nimport { parseOpenAIToolResultOutput } from \"./tool-result\";\n\nfunction mapStreamErrorEvent(event: {\n  code?: string | null;\n  message?: string;\n}): Error {\n  const msg = event.message ?? \"Stream error\";\n  const code = event.code ?? \"\";\n  if (\n    code === \"invalid_api_key\" ||\n    msg.toLowerCase().includes(\"unauthorized\")\n  ) {\n    return new ProviderAuthError(msg, { provider: OPENAI, cause: event });\n  }\n  if (\n    code === \"rate_limit_exceeded\" ||\n    msg.toLowerCase().includes(\"rate limit\")\n  ) {\n    return new ProviderRateLimitError(msg, { provider: OPENAI, cause: event });\n  }\n  if (\n    msg.toLowerCase().includes(\"unavailable\") ||\n    msg.toLowerCase().includes(\"503\")\n  ) {\n    return new ProviderUnavailableError(msg, {\n      provider: OPENAI,\n      cause: event,\n    });\n  }\n  return new ProviderResponseError(msg, { provider: OPENAI, cause: event });\n}\n\nexport class ResponseAccumulator {\n  content = \"\";\n  sessionId: string | undefined;\n  conversationId: string | undefined;\n  finishReason: Response[\"finishReason\"] = \"stop\";\n  usage: Usage | undefined;\n  actionsRequired: ActionRequired[] = [];\n  done = false;\n  stepIndex = 0;\n\n  toResponse(): Response {\n    return {\n      content: this.content,\n      sessionId: this.conversationId ?? this.sessionId,\n      finishReason: this.finishReason,\n      usage: this.usage,\n      actionsRequired:\n        this.actionsRequired.length > 0 ? this.actionsRequired : undefined,\n    };\n  }\n}\n\nexport function* mapEvent(\n  event: ResponseStreamEvent,\n  acc: ResponseAccumulator,\n): Generator<StreamPart> {\n  switch (event.type) {\n    case \"response.created\": {\n      acc.sessionId = event.response.id;\n      acc.conversationId = event.response.conversation?.id;\n      yield {\n        type: \"stream-start\",\n        sessionId: acc.conversationId ?? acc.sessionId,\n      };\n      break;\n    }\n    case \"response.in_progress\": {\n      yield { type: \"status-change\", status: \"running\" };\n      yield { type: \"step-start\", stepIndex: acc.stepIndex };\n      break;\n    }\n    case \"response.completed\": {\n      if (event.response.usage) {\n        acc.usage = {\n          inputTokens: event.response.usage.input_tokens,\n          outputTokens: event.response.usage.output_tokens,\n          totalTokens: event.response.usage.total_tokens,\n        };\n      }\n      if (!acc.content) {\n        acc.content = event.response.output_text;\n      }\n      yield { type: \"step-done\", stepIndex: acc.stepIndex };\n      acc.stepIndex++;\n      acc.done = true;\n      break;\n    }\n    case \"response.failed\": {\n      acc.finishReason = \"error\";\n      throw new ThalamusError(\n        event.response.error?.message ?? \"Response failed\",\n        { provider: OPENAI, isRetryable: false },\n      );\n    }\n    case \"response.incomplete\": {\n      acc.finishReason = \"length\";\n      break;\n    }\n\n    case \"response.output_text.delta\": {\n      acc.content += event.delta;\n      yield { type: \"text-delta\", text: event.delta };\n      break;\n    }\n\n    case \"response.refusal.delta\": {\n      acc.finishReason = \"refused\";\n      yield { type: \"refusal\", text: event.delta };\n      break;\n    }\n\n    case \"response.reasoning_summary_text.delta\": {\n      yield { type: \"thinking\", text: event.delta };\n      break;\n    }\n\n    case \"response.output_item.added\": {\n      const e = event as ResponseOutputItemAddedEvent;\n      if (e.item.type === \"function_call\") {\n        yield {\n          type: \"tool-use-start\",\n          toolName: e.item.name,\n          toolUseId: e.item.call_id,\n          source: { type: \"builtin\" },\n        };\n      } else if (e.item.type === \"mcp_call\") {\n        const item = e.item as ResponseOutputItem.McpCall;\n        yield {\n          type: \"tool-use-start\",\n          toolName: item.name,\n          toolUseId: item.id,\n          source: { type: \"mcp\", serverName: item.server_label },\n        };\n      }\n      break;\n    }\n    case \"response.function_call_arguments.delta\": {\n      yield {\n        type: \"tool-use-delta\",\n        toolUseId: event.item_id,\n        argumentsDelta: event.delta,\n      };\n      break;\n    }\n    case \"response.mcp_call_arguments.delta\": {\n      const e = event as ResponseMcpCallArgumentsDeltaEvent;\n      yield {\n        type: \"tool-use-delta\",\n        toolUseId: e.item_id,\n        argumentsDelta: e.delta,\n      };\n      break;\n    }\n    case \"response.output_item.done\": {\n      const e = event as ResponseOutputItemDoneEvent;\n      if (e.item.type === \"function_call\") {\n        yield {\n          type: \"tool-use-done\",\n          toolName: e.item.name,\n          toolUseId: e.item.call_id,\n          input: JSON.parse(e.item.arguments || \"{}\"),\n          source: { type: \"builtin\" },\n        };\n      } else if (e.item.type === \"mcp_list_tools\") {\n        const item = e.item as ResponseOutputItem.McpListTools;\n        yield {\n          type: \"mcp-tools-discovered\",\n          serverName: item.server_label,\n          tools: (item.tools ?? []).map((t) => ({\n            name: t.name,\n            description: t.description ?? undefined,\n            inputSchema: t.input_schema as Record<string, unknown> | undefined,\n          })),\n        };\n      } else if (e.item.type === \"mcp_call\") {\n        const item = e.item as ResponseOutputItem.McpCall;\n        yield {\n          type: \"tool-use-done\",\n          toolName: item.name,\n          toolUseId: item.id,\n          input: JSON.parse(item.arguments || \"{}\"),\n          source: { type: \"mcp\", serverName: item.server_label },\n        };\n        yield {\n          type: \"tool-use-result\",\n          toolUseId: item.id,\n          content: parseOpenAIToolResultOutput(item.output),\n          source: { type: \"mcp\", serverName: item.server_label },\n        };\n      } else if (e.item.type === \"mcp_approval_request\") {\n        const item = e.item as ResponseOutputItem.McpApprovalRequest;\n        acc.finishReason = \"requires-action\";\n        acc.actionsRequired.push({\n          type: \"mcp-approval\",\n          toolUseId: item.id,\n          toolName: item.name,\n          serverName: item.server_label,\n          input: JSON.parse(item.arguments || \"{}\"),\n        });\n      }\n      break;\n    }\n\n    case \"error\": {\n      throw mapStreamErrorEvent(\n        event as { code?: string | null; message?: string },\n      );\n    }\n\n    default: {\n      yield {\n        type: \"provider-event\",\n        provider: OPENAI,\n        event: event.type,\n        data: event as unknown as Record<string, unknown>,\n      };\n      break;\n    }\n  }\n}\n","export interface SigV4FetchOptions {\n  region: string;\n  credentials: {\n    accessKeyId: string;\n    secretAccessKey: string;\n    sessionToken?: string;\n  };\n}\n\ntype Fetch = (\n  input: string | URL | Request,\n  init?: RequestInit,\n) => Promise<Response>;\n\n/**\n * Creates a custom fetch function that signs requests with AWS SigV4.\n * Requires optional peer deps: @smithy/signature-v4, @aws-crypto/sha256-js\n */\nexport function createSigV4Fetch(options: SigV4FetchOptions): Fetch {\n  const { region, credentials } = options;\n\n  return async (\n    input: string | URL | Request,\n    init?: RequestInit,\n  ): Promise<Response> => {\n    // Dynamic imports — optional peer deps, types unavailable at compile time\n    let SignatureV4: any;\n    let Sha256: any;\n    try {\n      SignatureV4 = (\n        await import(/* webpackIgnore: true */ \"@smithy/signature-v4\")\n      ).SignatureV4;\n      Sha256 = (await import(/* webpackIgnore: true */ \"@aws-crypto/sha256-js\"))\n        .Sha256;\n    } catch {\n      throw new Error(\n        \"SigV4 auth requires @smithy/signature-v4 and @aws-crypto/sha256-js. \" +\n          \"Install them: pnpm add @smithy/signature-v4 @aws-crypto/sha256-js\",\n      );\n    }\n\n    const signer = new SignatureV4({\n      service: \"bedrock\",\n      region,\n      credentials,\n      sha256: Sha256,\n    });\n\n    const url = new URL(\n      typeof input === \"string\"\n        ? input\n        : input instanceof URL\n          ? input.href\n          : input.url,\n    );\n    const body = init?.body ? String(init.body) : undefined;\n\n    const headers: Record<string, string> = {};\n    if (init?.headers) {\n      const h = init.headers;\n      if (h instanceof Headers) {\n        h.forEach((v, k) => {\n          headers[k] = v;\n        });\n      } else if (Array.isArray(h)) {\n        for (const [k, v] of h) headers[k] = v;\n      } else {\n        Object.assign(headers, h);\n      }\n    }\n\n    const signed = await signer.sign({\n      method: init?.method ?? \"GET\",\n      protocol: url.protocol,\n      hostname: url.hostname,\n      port: url.port ? Number(url.port) : undefined,\n      path: url.pathname + url.search,\n      headers: { ...headers, host: url.host },\n      body,\n    });\n\n    return globalThis.fetch(input, {\n      ...init,\n      headers: signed.headers,\n    });\n  };\n}\n"],"mappings":"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","names":["OpenAI"]}