{"version":3,"sources":["../src/convert-to-opencode-messages.ts","../src/opencode-part-utils.ts","../src/convert-from-opencode-events.ts","../src/errors.ts","../src/map-opencode-finish-reason.ts","../src/logger.ts","../src/validation.ts","../src/opencode-language-model.ts","../src/opencode-client-manager.ts","../src/opencode-provider.ts"],"names":["warning","LoadAPIKeyError","APICallError","z","InvalidArgumentError","filteredOptions","provider","NoSuchModelError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  LanguageModelV3Prompt,\n  LanguageModelV3TextPart,\n  LanguageModelV3FilePart,\n  LanguageModelV3ToolCallPart,\n  LanguageModelV3ToolResultPart,\n  LanguageModelV3ReasoningPart,\n  LanguageModelV3ToolApprovalResponsePart,\n} from \"@ai-sdk/provider\";\nimport type { Logger } from \"./types.js\";\n\n/**\n * Input part types for OpenCode SDK.\n * Based on SessionPromptData.body.parts in the SDK.\n */\nexport interface TextPartInput {\n  id?: string;\n  type: \"text\";\n  text: string;\n  synthetic?: boolean;\n  ignored?: boolean;\n}\n\nexport interface FilePartInput {\n  id?: string;\n  type: \"file\";\n  mime: string;\n  filename?: string;\n  url: string;\n}\n\nexport type OpencodePartInput = TextPartInput | FilePartInput;\n\n/**\n * Result of converting AI SDK messages to OpenCode format.\n */\nexport interface ConversionResult {\n  parts: OpencodePartInput[];\n  systemPrompt?: string;\n  warnings: string[];\n}\n\n/**\n * Convert AI SDK prompt to OpenCode format.\n */\nexport function convertToOpencodeMessages(\n  prompt: LanguageModelV3Prompt,\n  options?: {\n    logger?: Logger | false;\n    mode?: { type: \"regular\" } | { type: \"object-json\"; schema?: unknown };\n    includeToolApprovalResponsesAsContext?: boolean;\n  },\n): ConversionResult {\n  const parts: OpencodePartInput[] = [];\n  const warnings: string[] = [];\n  let systemPrompt: string | undefined;\n  const logger = options?.logger;\n\n  for (const message of prompt) {\n    switch (message.role) {\n      case \"system\":\n        // Collect system messages into system prompt\n        if (systemPrompt) {\n          systemPrompt += \"\\n\\n\" + message.content;\n        } else {\n          systemPrompt = message.content;\n        }\n        break;\n\n      case \"user\":\n        // Convert user message parts\n        for (const part of message.content) {\n          const converted = convertUserPart(part, warnings, logger);\n          if (converted) {\n            parts.push(converted);\n          }\n        }\n        break;\n\n      case \"assistant\": {\n        // Convert assistant message parts (for context in multi-turn)\n        const assistantParts = convertAssistantContent(\n          message.content,\n          warnings,\n          logger,\n        );\n        parts.push(...assistantParts);\n        break;\n      }\n\n      case \"tool\": {\n        // Tool results - include as context text\n        const toolResultParts = convertToolResults(\n          message.content,\n          warnings,\n          logger,\n          options?.includeToolApprovalResponsesAsContext ?? false,\n        );\n        parts.push(...toolResultParts);\n        break;\n      }\n    }\n  }\n\n  // Add JSON mode instruction if needed\n  if (options?.mode?.type === \"object-json\") {\n    const jsonInstruction = createJsonModeInstruction(options.mode.schema);\n    parts.push({\n      type: \"text\",\n      text: jsonInstruction,\n    });\n  }\n\n  return { parts, systemPrompt, warnings };\n}\n\n/**\n * Convert a user message part to OpenCode format.\n */\nfunction convertUserPart(\n  part: LanguageModelV3TextPart | LanguageModelV3FilePart,\n  warnings: string[],\n  logger?: Logger | false,\n): OpencodePartInput | null {\n  switch (part.type) {\n    case \"text\":\n      return {\n        type: \"text\",\n        text: part.text,\n      };\n\n    case \"file\":\n      return convertFilePart(part, warnings, logger);\n\n    default: {\n      // Unknown part type\n      const unknownPart = part as { type: string };\n      const warning = `Unknown user message part type: ${unknownPart.type}`;\n      warnings.push(warning);\n      if (logger) {\n        logger.warn(warning);\n      }\n      return null;\n    }\n  }\n}\n\n/**\n * Convert a file part to OpenCode format.\n */\nfunction convertFilePart(\n  part: LanguageModelV3FilePart,\n  warnings: string[],\n  logger?: Logger | false,\n): FilePartInput | null {\n  const { data, mediaType, filename } = part;\n\n  // Handle different data formats\n  if (typeof data === \"string\") {\n    // Could be base64, data URL, or regular URL\n    if (data.startsWith(\"data:\")) {\n      // Data URL - use as-is\n      return {\n        type: \"file\",\n        mime: mediaType,\n        filename,\n        url: data,\n      };\n    }\n\n    if (data.startsWith(\"http://\") || data.startsWith(\"https://\")) {\n      // Remote URL - not supported by OpenCode\n      const warning = `Remote URLs are not supported for file input: ${data.substring(0, 50)}...`;\n      warnings.push(warning);\n      if (logger) {\n        logger.warn(warning);\n      }\n      return null;\n    }\n\n    // Assume base64 - convert to data URL\n    return {\n      type: \"file\",\n      mime: mediaType,\n      filename,\n      url: `data:${mediaType};base64,${normalizeBase64(data)}`,\n    };\n  }\n\n  if (data instanceof Uint8Array) {\n    // Binary data - convert to base64 data URL\n    const base64 = uint8ArrayToBase64(data);\n    return {\n      type: \"file\",\n      mime: mediaType,\n      filename,\n      url: `data:${mediaType};base64,${base64}`,\n    };\n  }\n\n  // URL object\n  if (data instanceof URL) {\n    const urlString = data.toString();\n    if (urlString.startsWith(\"data:\")) {\n      return {\n        type: \"file\",\n        mime: mediaType,\n        filename,\n        url: urlString,\n      };\n    }\n\n    const warning = `Remote URLs are not supported for file input: ${urlString.substring(0, 50)}...`;\n    warnings.push(warning);\n    if (logger) {\n      logger.warn(warning);\n    }\n    return null;\n  }\n\n  const warning = `Unsupported file data type: ${typeof data}`;\n  warnings.push(warning);\n  if (logger) {\n    logger.warn(warning);\n  }\n  return null;\n}\n\n/**\n * Convert assistant message content to OpenCode parts.\n * Used for providing context in multi-turn conversations.\n */\nfunction convertAssistantContent(\n  content: Array<\n    | LanguageModelV3TextPart\n    | LanguageModelV3FilePart\n    | LanguageModelV3ReasoningPart\n    | LanguageModelV3ToolCallPart\n    | LanguageModelV3ToolResultPart\n  >,\n  warnings: string[],\n  logger?: Logger | false,\n): OpencodePartInput[] {\n  const parts: OpencodePartInput[] = [];\n\n  for (const part of content) {\n    switch (part.type) {\n      case \"text\":\n        // Include assistant text as context\n        parts.push({\n          type: \"text\",\n          text: `[Assistant]: ${part.text}`,\n          synthetic: true,\n        });\n        break;\n\n      case \"reasoning\":\n        // Include reasoning as context (marked as synthetic)\n        parts.push({\n          type: \"text\",\n          text: `[Reasoning]: ${part.text}`,\n          synthetic: true,\n        });\n        break;\n\n      case \"tool-call\":\n        // Include tool call as context\n        parts.push({\n          type: \"text\",\n          text: `[Tool Call: ${part.toolName}]: ${JSON.stringify(part.input)}`,\n          synthetic: true,\n        });\n        break;\n\n      case \"tool-result\": {\n        // Include tool result as context\n        const resultText = formatToolResult(part);\n        parts.push({\n          type: \"text\",\n          text: `[Tool Result: ${part.toolName}]: ${resultText}`,\n          synthetic: true,\n        });\n        break;\n      }\n\n      case \"file\": {\n        // Files from assistant are typically generated - skip for now\n        const warning =\n          \"File parts in assistant messages are not yet supported\";\n        warnings.push(warning);\n        if (logger) {\n          logger.warn(warning);\n        }\n        break;\n      }\n    }\n  }\n\n  return parts;\n}\n\n/**\n * Convert tool result messages to OpenCode parts.\n */\nfunction convertToolResults(\n  content: Array<\n    LanguageModelV3ToolResultPart | LanguageModelV3ToolApprovalResponsePart\n  >,\n  warnings: string[],\n  logger?: Logger | false,\n  includeToolApprovalResponsesAsContext = false,\n): OpencodePartInput[] {\n  const parts: OpencodePartInput[] = [];\n\n  // Note: OpenCode executes tools server-side, so we can only include\n  // tool results as context. The server won't use these as actual tool results.\n  const warning =\n    \"Tool results in prompts are included as context only. \" +\n    \"OpenCode executes tools server-side and cannot use client-provided results.\";\n\n  const hasToolResult = content.some((part) => part.type === \"tool-result\");\n  if (hasToolResult && !warnings.includes(warning)) {\n    warnings.push(warning);\n    if (logger) {\n      logger.warn(warning);\n    }\n  }\n\n  for (const part of content) {\n    if (part.type === \"tool-result\") {\n      const resultText = formatToolResult(part);\n      parts.push({\n        type: \"text\",\n        text: `[Tool Result: ${part.toolName}]: ${resultText}`,\n        synthetic: true,\n      });\n      continue;\n    }\n\n    if (\n      part.type === \"tool-approval-response\" &&\n      includeToolApprovalResponsesAsContext\n    ) {\n      const reasonText = part.reason ? ` (${part.reason})` : \"\";\n      parts.push({\n        type: \"text\",\n        text: `[Tool Approval: ${part.approvalId}]: ${part.approved ? \"approved\" : \"denied\"}${reasonText}`,\n        synthetic: true,\n      });\n      continue;\n    }\n  }\n\n  return parts;\n}\n\n/**\n * Format a tool result for text representation.\n */\nfunction formatToolResult(part: LanguageModelV3ToolResultPart): string {\n  const output = part.output;\n\n  switch (output.type) {\n    case \"text\":\n      return output.value;\n\n    case \"json\":\n      return JSON.stringify(output.value, null, 2);\n\n    case \"error-text\":\n      return `Error: ${output.value}`;\n\n    case \"error-json\":\n      return `Error: ${JSON.stringify(output.value)}`;\n\n    case \"content\":\n      return output.value\n        .map((item) => {\n          if (item.type === \"text\") {\n            return item.text;\n          }\n          if (item.type === \"file-data\") {\n            return `[File: ${item.mediaType}]`;\n          }\n          if (item.type === \"file-url\") {\n            return `[File URL: ${item.url}]`;\n          }\n          if (item.type === \"file-id\") {\n            return \"[File ID]\";\n          }\n          if (item.type === \"image-data\") {\n            return `[Image: ${item.mediaType}]`;\n          }\n          if (item.type === \"image-url\") {\n            return `[Image URL: ${item.url}]`;\n          }\n          if (item.type === \"image-file-id\") {\n            return \"[Image File ID]\";\n          }\n          return \"[Content]\";\n        })\n        .join(\"\\n\");\n    case \"execution-denied\":\n      return output.reason\n        ? `Execution denied: ${output.reason}`\n        : \"Execution denied\";\n\n    default:\n      return JSON.stringify(output);\n  }\n}\n\n/**\n * Create instruction text for JSON mode.\n */\nfunction createJsonModeInstruction(schema?: unknown): string {\n  let instruction =\n    \"IMPORTANT: You must respond with valid JSON only. \" +\n    \"Do not include any text before or after the JSON. \" +\n    \"Do not include markdown code blocks.\";\n\n  if (schema) {\n    instruction +=\n      \"\\n\\nThe JSON must conform to this schema:\\n\" +\n      JSON.stringify(schema, null, 2);\n  }\n\n  return instruction;\n}\n\n/**\n * Normalize base64 string by removing whitespace.\n */\nfunction normalizeBase64(base64: string): string {\n  return base64.replace(/\\s/g, \"\");\n}\n\n/**\n * Convert Uint8Array to base64 string.\n */\nfunction uint8ArrayToBase64(data: Uint8Array): string {\n  // In Node.js, we can use Buffer\n  if (typeof Buffer !== \"undefined\") {\n    return Buffer.from(data).toString(\"base64\");\n  }\n\n  // Fallback for environments without Buffer\n  let binary = \"\";\n  for (let i = 0; i < data.length; i++) {\n    binary += String.fromCharCode(data[i]!);\n  }\n  return btoa(binary);\n}\n\n/**\n * Extract the text content from an array of parts.\n */\nexport function extractTextFromParts(parts: OpencodePartInput[]): string {\n  return parts\n    .filter((part): part is TextPartInput => part.type === \"text\")\n    .map((part) => part.text)\n    .join(\"\\n\");\n}\n","/**\n * Shared utilities for OpenCode tool/file part conversion.\n */\n\nexport interface OpencodeFileSource {\n  type?: string;\n  path?: string;\n  uri?: string;\n  [key: string]: unknown;\n}\n\nexport interface OpencodeFilePartLike {\n  id?: string;\n  mime?: string;\n  filename?: string;\n  url?: string;\n  source?: OpencodeFileSource;\n}\n\nexport type FilePartPlanError = \"missing-metadata\" | \"invalid-data-url\";\n\ninterface FilePartPlanDocument {\n  id: string;\n  mediaType: string;\n  title: string;\n  filename?: string;\n}\n\nexport interface FilePartPlan {\n  sourceMetadata?: OpencodeFileSource;\n  primary:\n    | {\n        type: \"file\";\n        mediaType: string;\n        data: string;\n      }\n    | {\n        type: \"source-url\";\n        id: string;\n        url: string;\n        title?: string;\n      }\n    | ({\n        type: \"source-document\";\n      } & FilePartPlanDocument);\n  secondaryDocumentSource?: FilePartPlanDocument;\n}\n\nexport function safeStringifyToolInput(\n  input: unknown,\n  onError?: (message: string) => void,\n): string {\n  try {\n    return JSON.stringify(input) ?? \"{}\";\n  } catch (error) {\n    const message = error instanceof Error ? error.message : String(error);\n    onError?.(message);\n    return \"{}\";\n  }\n}\n\nexport function parseDataUrl(\n  dataUrl: string,\n): { mediaType: string; data: string } | null {\n  if (!dataUrl.startsWith(\"data:\")) {\n    return null;\n  }\n\n  const commaIndex = dataUrl.indexOf(\",\");\n  if (commaIndex === -1) {\n    return null;\n  }\n\n  const header = dataUrl.slice(\"data:\".length, commaIndex);\n  const payload = dataUrl.slice(commaIndex + 1);\n\n  const headerTokens = header.split(\";\");\n  const mediaTypeToken = headerTokens[0]?.trim();\n  const mediaType =\n    mediaTypeToken && mediaTypeToken.length > 0\n      ? mediaTypeToken\n      : \"application/octet-stream\";\n  const isBase64 = headerTokens\n    .slice(1)\n    .some((token) => token.trim().toLowerCase() === \"base64\");\n\n  if (isBase64) {\n    return {\n      mediaType,\n      data: payload.replace(/\\s+/g, \"\"),\n    };\n  }\n\n  let decodedPayload: string;\n  try {\n    decodedPayload = decodeURIComponent(payload);\n  } catch {\n    return null;\n  }\n\n  return {\n    mediaType,\n    data: Buffer.from(decodedPayload, \"utf8\").toString(\"base64\"),\n  };\n}\n\nexport function planFilePartConversion(part: OpencodeFilePartLike): {\n  plan?: FilePartPlan;\n  error?: FilePartPlanError;\n} {\n  if (!part.url || !part.mime) {\n    return { error: \"missing-metadata\" };\n  }\n\n  const sourceMetadata = part.source;\n  let primary: FilePartPlan[\"primary\"] | undefined;\n  let hasDocumentSource = false;\n\n  if (part.url.startsWith(\"data:\")) {\n    const parsed = parseDataUrl(part.url);\n    if (!parsed) {\n      return { error: \"invalid-data-url\" };\n    }\n\n    primary = {\n      type: \"file\",\n      mediaType: parsed.mediaType,\n      data: parsed.data,\n    };\n  } else if (\n    part.url.startsWith(\"http://\") ||\n    part.url.startsWith(\"https://\")\n  ) {\n    primary = {\n      type: \"source-url\",\n      id: part.id ?? part.url,\n      url: part.url,\n      ...(part.filename ? { title: part.filename } : {}),\n    };\n  } else {\n    const filename = part.filename ?? part.url.split(\"/\").pop() ?? \"file\";\n    primary = {\n      type: \"source-document\",\n      id: part.id ?? part.url,\n      mediaType: part.mime,\n      title: filename,\n      ...(filename ? { filename } : {}),\n    };\n    hasDocumentSource = true;\n  }\n\n  let secondaryDocumentSource: FilePartPlan[\"secondaryDocumentSource\"];\n  if (part.source && !hasDocumentSource) {\n    const sourceType = part.source.type;\n    if (\n      sourceType === \"file\" ||\n      sourceType === \"symbol\" ||\n      sourceType === \"resource\"\n    ) {\n      const title =\n        typeof part.source.path === \"string\"\n          ? part.source.path\n          : typeof part.source.uri === \"string\"\n            ? part.source.uri\n            : \"source\";\n\n      secondaryDocumentSource = {\n        id: `${part.id ?? \"source\"}-source`,\n        mediaType: part.mime,\n        title,\n        ...(typeof part.source.path === \"string\"\n          ? { filename: part.source.path }\n          : {}),\n      };\n    }\n  }\n\n  return {\n    plan: {\n      sourceMetadata,\n      primary,\n      ...(secondaryDocumentSource ? { secondaryDocumentSource } : {}),\n    },\n  };\n}\n","import type {\n  JSONValue,\n  LanguageModelV3StreamPart,\n  LanguageModelV3FinishReason,\n  SharedV3Warning,\n  LanguageModelV3Usage,\n} from \"@ai-sdk/provider\";\nimport type { Logger, ToolStreamState, StreamingUsage } from \"./types.js\";\nimport {\n  safeStringifyToolInput,\n  planFilePartConversion,\n} from \"./opencode-part-utils.js\";\n\n/**\n * Tool name used by OpenCode to return structured output.\n */\nexport const STRUCTURED_OUTPUT_TOOL = \"StructuredOutput\" as const;\n\n/**\n * OpenCode event types (from SDK types.gen.ts).\n */\nexport interface EventMessagePartUpdated {\n  type: \"message.part.updated\";\n  properties: {\n    part: Part;\n    delta?: string;\n  };\n}\n\nexport interface EventMessageUpdated {\n  type: \"message.updated\";\n  properties: {\n    info: Message;\n  };\n}\n\nexport interface EventSessionStatus {\n  type: \"session.status\";\n  properties: {\n    sessionID: string;\n    status:\n      | { type: \"idle\" }\n      | { type: \"busy\" }\n      | { type: \"retry\"; attempt: number; message: string; next: number };\n  };\n}\n\nexport interface EventSessionIdle {\n  type: \"session.idle\";\n  properties: {\n    sessionID: string;\n  };\n}\n\nexport interface EventPermissionAsked {\n  type: \"permission.asked\";\n  properties: {\n    id: string;\n    sessionID: string;\n    permission: string;\n    patterns: string[];\n    metadata?: Record<string, unknown>;\n    always?: string[];\n    tool?: {\n      messageID: string;\n      callID: string;\n    };\n  };\n}\n\nexport interface EventQuestionAsked {\n  type: \"question.asked\";\n  properties: {\n    id: string;\n    sessionID: string;\n    questions: Array<{\n      header: string;\n      question: string;\n      options: Array<{\n        label: string;\n        description: string;\n      }>;\n      multiple?: boolean;\n      custom?: boolean;\n    }>;\n    tool?: {\n      messageID: string;\n      callID: string;\n    };\n  };\n}\n\nexport interface EventMessagePartDelta {\n  type: \"message.part.delta\";\n  properties: {\n    sessionID: string;\n    messageID: string;\n    partID: string;\n    field: string;\n    delta: string;\n  };\n}\n\nexport type OpencodeEvent =\n  | EventMessagePartUpdated\n  | EventMessageUpdated\n  | EventMessagePartDelta\n  | EventSessionStatus\n  | EventSessionIdle\n  | EventPermissionAsked\n  | EventQuestionAsked\n  | { type: string; properties: unknown };\n\n/**\n * Part types from OpenCode SDK.\n */\nexport interface TextPart {\n  id: string;\n  sessionID: string;\n  messageID: string;\n  type: \"text\";\n  text: string;\n  synthetic?: boolean;\n  ignored?: boolean;\n}\n\nexport interface ReasoningPart {\n  id: string;\n  sessionID: string;\n  messageID: string;\n  type: \"reasoning\";\n  text: string;\n}\n\nexport interface FilePart {\n  id: string;\n  sessionID: string;\n  messageID: string;\n  type: \"file\";\n  mime: string;\n  filename?: string;\n  url: string;\n  source?: {\n    type?: string;\n    path?: string;\n    uri?: string;\n    [key: string]: unknown;\n  };\n}\n\nexport interface ToolPart {\n  id: string;\n  sessionID: string;\n  messageID: string;\n  type: \"tool\";\n  callID: string;\n  tool: string;\n  state: ToolState;\n}\n\nexport interface ToolStatePending {\n  status: \"pending\";\n  input: Record<string, unknown>;\n  raw: string;\n}\n\nexport interface ToolStateRunning {\n  status: \"running\";\n  input: Record<string, unknown>;\n  title?: string;\n  time: { start: number };\n}\n\nexport interface ToolStateCompleted {\n  status: \"completed\";\n  input: Record<string, unknown>;\n  output: string;\n  title: string;\n  time: { start: number; end: number };\n  attachments?: FilePart[];\n}\n\nexport interface ToolStateError {\n  status: \"error\";\n  input: Record<string, unknown>;\n  error: string;\n  time: { start: number; end: number };\n}\n\nexport type ToolState =\n  | ToolStatePending\n  | ToolStateRunning\n  | ToolStateCompleted\n  | ToolStateError;\n\nexport interface StepFinishPart {\n  id: string;\n  sessionID: string;\n  messageID: string;\n  type: \"step-finish\";\n  reason: string;\n  cost: number;\n  tokens: {\n    input: number;\n    output: number;\n    reasoning: number;\n    cache: {\n      read: number;\n      write: number;\n    };\n  };\n}\n\nexport type Part =\n  | TextPart\n  | ReasoningPart\n  | ToolPart\n  | StepFinishPart\n  | FilePart\n  | {\n      type: string;\n      sessionID: string;\n      messageID: string;\n      [key: string]: unknown;\n    };\n\nexport interface Message {\n  id: string;\n  sessionID: string;\n  role: \"user\" | \"assistant\";\n  error?: { name: string; data?: unknown };\n  finish?: string;\n}\n\n/**\n * State for tracking streaming progress.\n */\nexport interface StreamState {\n  textPartId: string | undefined;\n  textStarted: boolean;\n  reasoningPartId: string | undefined;\n  reasoningStarted: boolean;\n  toolStates: Map<string, ToolStreamState>;\n  usage: StreamingUsage;\n  lastTextContent: string;\n  lastReasoningContent: string;\n  messageRoles: Map<string, \"user\" | \"assistant\">;\n  permissionRequests: Set<string>;\n  questionRequests: Set<string>;\n}\n\n/**\n * Create initial stream state.\n */\nexport function createStreamState(): StreamState {\n  return {\n    textPartId: undefined,\n    textStarted: false,\n    reasoningPartId: undefined,\n    reasoningStarted: false,\n    toolStates: new Map(),\n    usage: {\n      inputTokens: 0,\n      outputTokens: 0,\n      reasoningTokens: 0,\n      cachedInputTokens: 0,\n      cachedWriteTokens: 0,\n      totalCost: 0,\n    },\n    lastTextContent: \"\",\n    lastReasoningContent: \"\",\n    messageRoles: new Map(),\n    permissionRequests: new Set(),\n    questionRequests: new Set(),\n  };\n}\n\n/**\n * Check if an event is for a specific session.\n */\nexport function isEventForSession(\n  event: OpencodeEvent,\n  sessionId: string,\n): boolean {\n  if (\n    \"properties\" in event &&\n    typeof event.properties === \"object\" &&\n    event.properties !== null\n  ) {\n    const props = event.properties as Record<string, unknown>;\n\n    if (\n      \"part\" in props &&\n      typeof props.part === \"object\" &&\n      props.part !== null\n    ) {\n      const part = props.part as Record<string, unknown>;\n      return part.sessionID === sessionId;\n    }\n\n    if (\n      \"info\" in props &&\n      typeof props.info === \"object\" &&\n      props.info !== null\n    ) {\n      const info = props.info as Record<string, unknown>;\n      return info.sessionID === sessionId;\n    }\n\n    if (\"sessionID\" in props) {\n      return props.sessionID === sessionId;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Check if an event indicates the session is complete.\n */\nexport function isSessionComplete(\n  event: OpencodeEvent,\n  sessionId: string,\n): boolean {\n  if (event.type === \"session.status\") {\n    const statusEvent = event as EventSessionStatus;\n    return (\n      statusEvent.properties.sessionID === sessionId &&\n      statusEvent.properties.status.type === \"idle\"\n    );\n  }\n\n  if (event.type === \"session.idle\") {\n    const idleEvent = event as EventSessionIdle;\n    return idleEvent.properties.sessionID === sessionId;\n  }\n\n  return false;\n}\n\n/**\n * Convert an OpenCode event to AI SDK stream parts.\n */\nexport function convertEventToStreamParts(\n  event: OpencodeEvent,\n  state: StreamState,\n  logger?: Logger | false,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n\n  switch (event.type) {\n    case \"message.part.updated\": {\n      const partEvent = event as EventMessagePartUpdated;\n      const partParts = handlePartUpdated(partEvent, state, logger);\n      parts.push(...partParts);\n      break;\n    }\n\n    case \"message.part.delta\": {\n      const deltaEvent = event as EventMessagePartDelta;\n      const deltaParts = handlePartDelta(deltaEvent, state);\n      parts.push(...deltaParts);\n      break;\n    }\n\n    case \"message.updated\": {\n      const messageEvent = event as EventMessageUpdated;\n      const info = messageEvent.properties.info;\n      state.messageRoles.set(info.id, info.role);\n      break;\n    }\n\n    case \"permission.asked\": {\n      const permissionEvent = event as EventPermissionAsked;\n      const requestId = permissionEvent.properties.id;\n\n      if (!state.permissionRequests.has(requestId)) {\n        state.permissionRequests.add(requestId);\n        parts.push({\n          type: \"tool-approval-request\",\n          approvalId: requestId,\n          toolCallId: permissionEvent.properties.tool?.callID ?? requestId,\n          providerMetadata: {\n            opencode: {\n              sessionId: permissionEvent.properties.sessionID,\n              permission: permissionEvent.properties.permission,\n              patterns: permissionEvent.properties.patterns,\n            },\n          },\n        });\n      }\n      break;\n    }\n\n    case \"question.asked\": {\n      const questionEvent = event as EventQuestionAsked;\n      const questionId = questionEvent.properties.id;\n\n      if (!state.questionRequests.has(questionId)) {\n        state.questionRequests.add(questionId);\n\n        const warning =\n          \"OpenCode question.asked events are not yet mapped to AI SDK responses. \" +\n          \"The provider cannot answer interactive questions automatically.\";\n        if (logger) {\n          logger.warn(warning);\n        }\n\n        parts.push({\n          type: \"error\",\n          error: new Error(\n            `${warning} Question ID: ${questionId}. ` +\n              \"If this blocks generation, answer/reject the question in OpenCode directly.\",\n          ),\n        });\n      }\n      break;\n    }\n\n    case \"session.status\":\n    case \"session.idle\":\n    case \"session.diff\":\n    case \"question.replied\":\n    case \"question.rejected\":\n    case \"project.updated\":\n    case \"server.instance.disposed\":\n    case \"global.disposed\":\n    case \"worktree.ready\":\n    case \"worktree.failed\":\n    case \"mcp.tools.changed\":\n      break;\n\n    default:\n      if (logger && logger.debug) {\n        logger.debug(`Unknown event type: ${event.type}`);\n      }\n  }\n\n  return parts;\n}\n\n/**\n * Handle a message.part.updated event.\n */\nfunction handlePartUpdated(\n  event: EventMessagePartUpdated,\n  state: StreamState,\n  logger?: Logger | false,\n): LanguageModelV3StreamPart[] {\n  const { part, delta } = event.properties;\n  const parts: LanguageModelV3StreamPart[] = [];\n\n  const messageRole = state.messageRoles.get(part.messageID);\n  if (messageRole === \"user\") {\n    return parts;\n  }\n\n  switch (part.type) {\n    case \"text\": {\n      const textPart = part as TextPart;\n      if (textPart.synthetic || textPart.ignored) {\n        break;\n      }\n      parts.push(...handleTextPart(textPart, delta, state));\n      break;\n    }\n\n    case \"reasoning\": {\n      const reasoningPart = part as ReasoningPart;\n      parts.push(...handleReasoningPart(reasoningPart, delta, state));\n      break;\n    }\n\n    case \"tool\": {\n      const toolPart = part as ToolPart;\n      parts.push(...handleToolPart(toolPart, state, logger));\n      break;\n    }\n\n    case \"step-finish\": {\n      const stepPart = part as StepFinishPart;\n      handleStepFinishPart(stepPart, state);\n      break;\n    }\n\n    case \"step-start\":\n    case \"subtask\":\n    case \"snapshot\":\n    case \"patch\":\n    case \"agent\":\n    case \"retry\":\n    case \"compaction\":\n      break;\n\n    case \"file\": {\n      const filePart = part as FilePart;\n      parts.push(...handleFilePart(filePart));\n      break;\n    }\n\n    default:\n      if (logger && logger.debug) {\n        logger.debug(`Unknown part type: ${(part as { type: string }).type}`);\n      }\n  }\n\n  return parts;\n}\n\nfunction handlePartDelta(\n  event: EventMessagePartDelta,\n  state: StreamState,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const { partID, messageID, field, delta } = event.properties;\n\n  if (!delta) return parts;\n\n  const messageRole = state.messageRoles.get(messageID);\n  if (messageRole === \"user\") {\n    return parts;\n  }\n\n  // OpenCode sends both text and reasoning parts with field set as \"text\".\n  // So we use the part ID tracked by prior message.part.updated events to differentiate.\n  const isReasoning = field === \"reasoning\" || state.reasoningPartId === partID;\n\n  if (isReasoning) {\n    if (!state.reasoningStarted || state.reasoningPartId !== partID) {\n      if (\n        state.reasoningStarted &&\n        state.reasoningPartId &&\n        state.reasoningPartId !== partID\n      ) {\n        parts.push({ type: \"reasoning-end\", id: state.reasoningPartId });\n      }\n      parts.push({ type: \"reasoning-start\", id: partID });\n      state.reasoningStarted = true;\n      state.reasoningPartId = partID;\n      state.lastReasoningContent = \"\";\n    }\n    parts.push({ type: \"reasoning-delta\", id: partID, delta });\n    state.lastReasoningContent += delta;\n  } else {\n    if (!state.textStarted || state.textPartId !== partID) {\n      if (state.textStarted && state.textPartId && state.textPartId !== partID) {\n        parts.push({ type: \"text-end\", id: state.textPartId });\n      }\n      parts.push({ type: \"text-start\", id: partID });\n      state.textStarted = true;\n      state.textPartId = partID;\n      state.lastTextContent = \"\";\n    }\n    parts.push({ type: \"text-delta\", id: partID, delta });\n    state.lastTextContent += delta;\n  }\n\n  return parts;\n}\n\nfunction handleTextPart(\n  part: TextPart,\n  delta: string | undefined,\n  state: StreamState,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const partId = part.id;\n\n  if (!state.textStarted || state.textPartId !== partId) {\n    if (state.textStarted && state.textPartId && state.textPartId !== partId) {\n      parts.push({ type: \"text-end\", id: state.textPartId });\n    }\n    parts.push({ type: \"text-start\", id: partId });\n    state.textStarted = true;\n    state.textPartId = partId;\n    state.lastTextContent = \"\";\n  }\n\n  if (delta) {\n    parts.push({ type: \"text-delta\", id: partId, delta });\n    state.lastTextContent += delta;\n  } else if (part.text && part.text !== state.lastTextContent) {\n    const newDelta = part.text.slice(state.lastTextContent.length);\n    if (newDelta) {\n      parts.push({ type: \"text-delta\", id: partId, delta: newDelta });\n      state.lastTextContent = part.text;\n    }\n  }\n\n  return parts;\n}\n\nfunction handleReasoningPart(\n  part: ReasoningPart,\n  delta: string | undefined,\n  state: StreamState,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const partId = part.id;\n\n  if (!state.reasoningStarted || state.reasoningPartId !== partId) {\n    if (\n      state.reasoningStarted &&\n      state.reasoningPartId &&\n      state.reasoningPartId !== partId\n    ) {\n      parts.push({ type: \"reasoning-end\", id: state.reasoningPartId });\n    }\n    parts.push({ type: \"reasoning-start\", id: partId });\n    state.reasoningStarted = true;\n    state.reasoningPartId = partId;\n    state.lastReasoningContent = \"\";\n  }\n\n  if (delta) {\n    parts.push({ type: \"reasoning-delta\", id: partId, delta });\n    state.lastReasoningContent += delta;\n  } else if (part.text && part.text !== state.lastReasoningContent) {\n    const newDelta = part.text.slice(state.lastReasoningContent.length);\n    if (newDelta) {\n      parts.push({ type: \"reasoning-delta\", id: partId, delta: newDelta });\n      state.lastReasoningContent = part.text;\n    }\n  }\n\n  return parts;\n}\n\nfunction handleToolPart(\n  part: ToolPart,\n  state: StreamState,\n  logger?: Logger | false,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const { callID, tool, state: toolState } = part;\n\n  // OpenCode's StructuredOutput tool carries the structured JSON in its\n  // input. The AI SDK expects structured output as text content so that\n  // `Output.object()` / `Output.array()` can parse it via `step.text`.\n  // Emit the tool input as text stream parts instead of tool stream parts.\n  if (tool === STRUCTURED_OUTPUT_TOOL) {\n    return handleStructuredOutputToolPart(callID, toolState, state, logger);\n  }\n\n  let streamState = state.toolStates.get(callID);\n  if (!streamState) {\n    streamState = {\n      callId: callID,\n      toolName: tool,\n      inputStarted: false,\n      inputClosed: false,\n      callEmitted: false,\n      resultEmitted: false,\n      emittedAttachmentIds: new Set(),\n    };\n    state.toolStates.set(callID, streamState);\n  }\n\n  switch (toolState.status) {\n    case \"pending\":\n      if (!streamState.inputStarted) {\n        parts.push({\n          type: \"tool-input-start\",\n          id: callID,\n          toolName: tool,\n          providerExecuted: true,\n          dynamic: true,\n        });\n        streamState.inputStarted = true;\n      }\n      break;\n\n    case \"running\": {\n      if (!streamState.inputStarted) {\n        parts.push({\n          type: \"tool-input-start\",\n          id: callID,\n          toolName: tool,\n          providerExecuted: true,\n          dynamic: true,\n          ...(toolState.title ? { title: toolState.title } : {}),\n        });\n        streamState.inputStarted = true;\n      }\n\n      const inputStr = safeStringifyToolInput(toolState.input, (message) => {\n        if (logger) {\n          logger.warn(\n            `Failed to serialize tool input for ${callID}: ${message}`,\n          );\n        }\n      });\n      if (!streamState.lastInput) {\n        if (inputStr) {\n          parts.push({\n            type: \"tool-input-delta\",\n            id: callID,\n            delta: inputStr,\n          });\n        }\n      } else if (inputStr.startsWith(streamState.lastInput)) {\n        const inputDelta = inputStr.slice(streamState.lastInput.length);\n        if (inputDelta) {\n          parts.push({\n            type: \"tool-input-delta\",\n            id: callID,\n            delta: inputDelta,\n          });\n        }\n      } else if (inputStr) {\n        // Input changed in a non-prefix way; emit the full input to avoid data loss.\n        parts.push({\n          type: \"tool-input-delta\",\n          id: callID,\n          delta: inputStr,\n        });\n      }\n      streamState.lastInput = inputStr;\n      break;\n    }\n\n    case \"completed\":\n      if (!streamState.inputClosed) {\n        if (!streamState.inputStarted) {\n          parts.push({\n            type: \"tool-input-start\",\n            id: callID,\n            toolName: tool,\n            providerExecuted: true,\n            dynamic: true,\n          });\n          streamState.inputStarted = true;\n        }\n        parts.push({ type: \"tool-input-end\", id: callID });\n        streamState.inputClosed = true;\n      }\n\n      if (!streamState.callEmitted) {\n        parts.push({\n          type: \"tool-call\",\n          toolCallId: callID,\n          toolName: tool,\n          input: safeStringifyToolInput(toolState.input, (message) => {\n            if (logger) {\n              logger.warn(\n                `Failed to serialize tool input for ${callID}: ${message}`,\n              );\n            }\n          }),\n          providerExecuted: true,\n          dynamic: true,\n        });\n        streamState.callEmitted = true;\n      }\n\n      if (!streamState.resultEmitted) {\n        parts.push({\n          type: \"tool-result\",\n          toolCallId: callID,\n          toolName: tool,\n          result: (toolState.output ?? \"\") as NonNullable<JSONValue>,\n          isError: false,\n          dynamic: true,\n        });\n        streamState.resultEmitted = true;\n      }\n\n      if (Array.isArray(toolState.attachments)) {\n        for (const attachment of toolState.attachments) {\n          const attachmentId =\n            attachment.id ??\n            `${attachment.url}|${attachment.mime}|${attachment.filename ?? \"\"}`;\n          if (streamState.emittedAttachmentIds.has(attachmentId)) {\n            continue;\n          }\n          parts.push(...handleFilePart(attachment));\n          streamState.emittedAttachmentIds.add(attachmentId);\n        }\n      }\n      break;\n\n    case \"error\":\n      if (!streamState.inputClosed) {\n        if (!streamState.inputStarted) {\n          parts.push({\n            type: \"tool-input-start\",\n            id: callID,\n            toolName: tool,\n            providerExecuted: true,\n            dynamic: true,\n          });\n          streamState.inputStarted = true;\n        }\n        parts.push({ type: \"tool-input-end\", id: callID });\n        streamState.inputClosed = true;\n      }\n\n      if (!streamState.callEmitted) {\n        parts.push({\n          type: \"tool-call\",\n          toolCallId: callID,\n          toolName: tool,\n          input: safeStringifyToolInput(toolState.input, (message) => {\n            if (logger) {\n              logger.warn(\n                `Failed to serialize tool input for ${callID}: ${message}`,\n              );\n            }\n          }),\n          providerExecuted: true,\n          dynamic: true,\n        });\n        streamState.callEmitted = true;\n      }\n\n      if (!streamState.resultEmitted) {\n        parts.push({\n          type: \"tool-result\",\n          toolCallId: callID,\n          toolName: tool,\n          result: (toolState.error ??\n            \"Unknown error\") as NonNullable<JSONValue>,\n          isError: true,\n          dynamic: true,\n        });\n        streamState.resultEmitted = true;\n\n        if (logger) {\n          logger.warn(`Tool ${tool} failed: ${toolState.error}`);\n        }\n      }\n      break;\n  }\n\n  return parts;\n}\n\n/**\n * Handle a StructuredOutput tool part by converting it to text stream parts.\n * The tool's input (the structured JSON) is streamed as text deltas so the\n * AI SDK can parse partial output and build `step.text` for `Output.object()`.\n */\nfunction handleStructuredOutputToolPart(\n  callID: string,\n  toolState: ToolState,\n  state: StreamState,\n  logger?: Logger | false,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const textId = `structured-output-${callID}`;\n\n  // We reuse the tool stream state map to track what we've already emitted,\n  // but only care about the text-related fields via the main StreamState.\n  let streamState = state.toolStates.get(callID);\n  if (!streamState) {\n    streamState = {\n      callId: callID,\n      toolName: STRUCTURED_OUTPUT_TOOL,\n      inputStarted: false,\n      inputClosed: false,\n      callEmitted: false,\n      resultEmitted: false,\n      emittedAttachmentIds: new Set(),\n    };\n    state.toolStates.set(callID, streamState);\n  }\n\n  const emitTextDelta = (status: string, input: Record<string, unknown>) => {\n    const inputStr = safeStringifyToolInput(input, (message) => {\n      if (logger) {\n        logger.warn(\n          `Failed to serialize StructuredOutput input for ${callID}: ${message}`,\n        );\n      }\n    });\n\n    if (logger) {\n      logger.debug?.(\n        `[StructuredOutput stream] callID=${callID} status=${status} raw input=${JSON.stringify(input)} serialized=${inputStr} lastInput=${streamState!.lastInput ?? \"(none)\"}`,\n      );\n    }\n\n    // OpenCode sends an empty {} input during early pending/running states\n    // before the actual structured data is populated. Skip it — emitting it\n    // would prepend a stray '{}' that breaks JSON parsing downstream.\n    // Only skip for non-completed statuses; a completed {} is a valid output.\n    if (inputStr === \"{}\" && status !== \"completed\") {\n      return;\n    }\n\n    if (!state.textStarted || state.textPartId !== textId) {\n      if (state.textStarted && state.textPartId && state.textPartId !== textId) {\n        parts.push({ type: \"text-end\", id: state.textPartId });\n      }\n      parts.push({ type: \"text-start\", id: textId });\n      state.textStarted = true;\n      state.textPartId = textId;\n      state.lastTextContent = \"\";\n    }\n\n    if (!streamState!.lastInput) {\n      if (inputStr) {\n        parts.push({ type: \"text-delta\", id: textId, delta: inputStr });\n      }\n    } else if (inputStr.startsWith(streamState!.lastInput)) {\n      const delta = inputStr.slice(streamState!.lastInput.length);\n      if (delta) {\n        parts.push({ type: \"text-delta\", id: textId, delta });\n      }\n    } else if (inputStr) {\n      if (logger) {\n        logger.debug?.(\n          `[StructuredOutput stream] callID=${callID} non-prefix change detected, emitting full input. prev=${streamState!.lastInput} new=${inputStr}`,\n        );\n      }\n      parts.push({ type: \"text-delta\", id: textId, delta: inputStr });\n    }\n    streamState!.lastInput = inputStr;\n    state.lastTextContent = inputStr;\n  };\n\n  switch (toolState.status) {\n    case \"pending\":\n      emitTextDelta(\"pending\", toolState.input);\n      break;\n\n    case \"running\":\n      emitTextDelta(\"running\", toolState.input);\n      break;\n\n    case \"completed\":\n      emitTextDelta(\"completed\", toolState.input);\n      if (state.textStarted && state.textPartId === textId) {\n        parts.push({ type: \"text-end\", id: textId });\n        state.textStarted = false;\n        state.textPartId = undefined;\n      }\n      break;\n\n    case \"error\":\n      if (state.textStarted && state.textPartId === textId) {\n        parts.push({ type: \"text-end\", id: textId });\n        state.textStarted = false;\n        state.textPartId = undefined;\n      }\n      break;\n  }\n\n  return parts;\n}\n\nfunction handleStepFinishPart(part: StepFinishPart, state: StreamState): void {\n  state.usage.inputTokens += part.tokens.input;\n  state.usage.outputTokens += part.tokens.output;\n  state.usage.reasoningTokens += part.tokens.reasoning;\n  state.usage.cachedInputTokens += part.tokens.cache.read;\n  state.usage.cachedWriteTokens += part.tokens.cache.write;\n  state.usage.totalCost += part.cost;\n}\n\nfunction handleFilePart(part: FilePart): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const { plan } = planFilePartConversion(part);\n  if (!plan) {\n    return parts;\n  }\n\n  if (plan.primary.type === \"file\") {\n    parts.push({\n      type: \"file\",\n      mediaType: plan.primary.mediaType,\n      data: plan.primary.data,\n      ...(plan.sourceMetadata\n        ? {\n            providerMetadata: {\n              opencode: {\n                source: plan.sourceMetadata as unknown as JSONValue,\n              },\n            },\n          }\n        : {}),\n    });\n  } else if (plan.primary.type === \"source-url\") {\n    parts.push({\n      type: \"source\",\n      sourceType: \"url\",\n      id: plan.primary.id,\n      url: plan.primary.url,\n      ...(plan.primary.title ? { title: plan.primary.title } : {}),\n    });\n  } else {\n    parts.push({\n      type: \"source\",\n      sourceType: \"document\",\n      id: plan.primary.id,\n      mediaType: plan.primary.mediaType,\n      title: plan.primary.title,\n      ...(plan.primary.filename ? { filename: plan.primary.filename } : {}),\n      ...(plan.sourceMetadata\n        ? {\n            providerMetadata: {\n              opencode: {\n                source: plan.sourceMetadata as unknown as JSONValue,\n              },\n            },\n          }\n        : {}),\n    });\n  }\n\n  if (plan.secondaryDocumentSource) {\n    parts.push({\n      type: \"source\",\n      sourceType: \"document\",\n      id: plan.secondaryDocumentSource.id,\n      mediaType: plan.secondaryDocumentSource.mediaType,\n      title: plan.secondaryDocumentSource.title,\n      ...(plan.secondaryDocumentSource.filename\n        ? { filename: plan.secondaryDocumentSource.filename }\n        : {}),\n      ...(plan.sourceMetadata\n        ? {\n            providerMetadata: {\n              opencode: {\n                source: plan.sourceMetadata as unknown as JSONValue,\n              },\n            },\n          }\n        : {}),\n    });\n  }\n\n  return parts;\n}\n\n/**\n * Create the final stream parts to close out the stream.\n */\nexport function createFinishParts(\n  state: StreamState,\n  finishReason: LanguageModelV3FinishReason,\n  sessionId: string,\n  messageId?: string,\n): LanguageModelV3StreamPart[] {\n  const parts: LanguageModelV3StreamPart[] = [];\n  const inputTokensTotal =\n    state.usage.inputTokens +\n    state.usage.cachedInputTokens +\n    state.usage.cachedWriteTokens;\n  const usage: LanguageModelV3Usage = {\n    inputTokens: {\n      total: inputTokensTotal,\n      noCache: state.usage.inputTokens,\n      cacheRead: state.usage.cachedInputTokens,\n      cacheWrite: state.usage.cachedWriteTokens,\n    },\n    outputTokens: {\n      total: state.usage.outputTokens,\n      text: undefined,\n      reasoning: state.usage.reasoningTokens,\n    },\n    raw: {\n      input_tokens: state.usage.inputTokens,\n      output_tokens: state.usage.outputTokens,\n      reasoning_tokens: state.usage.reasoningTokens,\n      cache_read_input_tokens: state.usage.cachedInputTokens,\n      cache_write_input_tokens: state.usage.cachedWriteTokens,\n      total_cost: state.usage.totalCost,\n    },\n  };\n\n  if (state.textStarted && state.textPartId) {\n    parts.push({ type: \"text-end\", id: state.textPartId });\n  }\n\n  if (state.reasoningStarted && state.reasoningPartId) {\n    parts.push({ type: \"reasoning-end\", id: state.reasoningPartId });\n  }\n\n  parts.push({\n    type: \"finish\",\n    usage,\n    finishReason,\n    providerMetadata: {\n      opencode: {\n        sessionId,\n        ...(messageId ? { messageId } : {}),\n        cost: state.usage.totalCost,\n      },\n    },\n  });\n\n  return parts;\n}\n\n/**\n * Create stream start part with warnings.\n */\nexport function createStreamStartPart(\n  warnings: string[],\n): LanguageModelV3StreamPart {\n  const callWarnings: SharedV3Warning[] = warnings.map((warning) => ({\n    type: \"other\" as const,\n    message: warning,\n  }));\n\n  return {\n    type: \"stream-start\",\n    warnings: callWarnings,\n  };\n}\n","import { APICallError, LoadAPIKeyError } from \"@ai-sdk/provider\";\n\n/**\n * Metadata for OpenCode errors.\n */\nexport interface OpencodeErrorMetadata {\n  sessionId?: string;\n  messageId?: string;\n  statusCode?: number;\n  isRetryable: boolean;\n  errorType?: string;\n  timeoutMs?: number;\n}\n\n/**\n * Check if an error is an authentication error.\n */\nexport function isAuthenticationError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\") {\n    return false;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  // Check error name\n  if (typeof err.name === \"string\" && err.name === \"ProviderAuthError\") {\n    return true;\n  }\n\n  // Check for status code 401 or 403\n  if (\n    typeof err.statusCode === \"number\" &&\n    (err.statusCode === 401 || err.statusCode === 403)\n  ) {\n    return true;\n  }\n\n  // Check message for auth-related keywords\n  if (typeof err.message === \"string\") {\n    const message = err.message.toLowerCase();\n    return (\n      message.includes(\"unauthorized\") ||\n      message.includes(\"authentication\") ||\n      message.includes(\"api key\") ||\n      message.includes(\"invalid key\") ||\n      message.includes(\"auth failed\")\n    );\n  }\n\n  return false;\n}\n\n/**\n * Check if an error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\") {\n    return false;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  // Check error name\n  if (typeof err.name === \"string\") {\n    const name = err.name.toLowerCase();\n    if (name.includes(\"timeout\")) {\n      return true;\n    }\n  }\n\n  // Check error code\n  if (typeof err.code === \"string\") {\n    const code = err.code.toUpperCase();\n    if (code === \"ETIMEDOUT\" || code === \"ESOCKETTIMEDOUT\") {\n      return true;\n    }\n  }\n\n  // Check message\n  if (typeof err.message === \"string\") {\n    const message = err.message.toLowerCase();\n    return message.includes(\"timeout\") || message.includes(\"timed out\");\n  }\n\n  return false;\n}\n\n/**\n * Check if an error is an abort error (user cancelled).\n */\nexport function isAbortError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\") {\n    return false;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  if (typeof err.name === \"string\" && err.name === \"AbortError\") {\n    return true;\n  }\n\n  if (typeof err.code === \"string\" && err.code.toUpperCase() === \"ABORT_ERR\") {\n    return true;\n  }\n\n  if (typeof err.name === \"string\" && err.name === \"MessageAbortedError\") {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Check if an error indicates output length exceeded.\n */\nexport function isOutputLengthError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\") {\n    return false;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  if (typeof err.name === \"string\" && err.name === \"MessageOutputLengthError\") {\n    return true;\n  }\n\n  if (typeof err.name === \"string\" && err.name === \"ContextOverflowError\") {\n    return true;\n  }\n\n  if (typeof err.message === \"string\") {\n    const message = err.message.toLowerCase();\n    return (\n      message.includes(\"output length\") ||\n      message.includes(\"max tokens\") ||\n      message.includes(\"token limit\")\n    );\n  }\n\n  return false;\n}\n\n/**\n * Create an authentication error from an OpenCode error.\n */\nexport function createAuthenticationError(error: unknown): LoadAPIKeyError {\n  const message = extractErrorMessage(error);\n  const providerInfo = extractProviderInfo(error);\n\n  return new LoadAPIKeyError({\n    message: providerInfo\n      ? `OpenCode authentication error (${providerInfo}): ${message}`\n      : `OpenCode authentication error: ${message}`,\n  });\n}\n\n/**\n * Create an API call error from an OpenCode error.\n */\nexport function createAPICallError(\n  error: unknown,\n  metadata?: Partial<OpencodeErrorMetadata>,\n): APICallError {\n  const message = extractErrorMessage(error);\n  const statusCode = extractStatusCode(error);\n  const isRetryable = metadata?.isRetryable ?? isRetryableError(error);\n\n  return new APICallError({\n    message,\n    url: \"opencode://session\",\n    requestBodyValues: {},\n    statusCode,\n    isRetryable,\n    data: {\n      errorType: metadata?.errorType ?? extractErrorType(error),\n      sessionId: metadata?.sessionId,\n      messageId: metadata?.messageId,\n    },\n  });\n}\n\n/**\n * Create a timeout error.\n */\nexport function createTimeoutError(\n  timeoutMs: number,\n  operation?: string,\n): APICallError {\n  const operationDesc = operation ? ` during ${operation}` : \"\";\n  return new APICallError({\n    message: `OpenCode request timed out after ${timeoutMs}ms${operationDesc}`,\n    url: \"opencode://session\",\n    requestBodyValues: {},\n    isRetryable: true,\n  });\n}\n\n/**\n * Extract error message from unknown error.\n */\nexport function extractErrorMessage(error: unknown): string {\n  if (!error) {\n    return \"Unknown error\";\n  }\n\n  if (typeof error === \"string\") {\n    return error;\n  }\n\n  if (error instanceof Error) {\n    return error.message;\n  }\n\n  if (typeof error === \"object\") {\n    const err = error as Record<string, unknown>;\n\n    if (typeof err.message === \"string\") {\n      return err.message;\n    }\n\n    if (typeof err.error === \"string\") {\n      return err.error;\n    }\n\n    // Check for nested data.message\n    if (typeof err.data === \"object\" && err.data !== null) {\n      const data = err.data as Record<string, unknown>;\n      if (typeof data.message === \"string\") {\n        return data.message;\n      }\n    }\n  }\n\n  return \"Unknown error\";\n}\n\n/**\n * Extract status code from error.\n */\nfunction extractStatusCode(error: unknown): number | undefined {\n  if (!error || typeof error !== \"object\") {\n    return undefined;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  if (typeof err.statusCode === \"number\") {\n    return err.statusCode;\n  }\n\n  if (typeof err.status === \"number\") {\n    return err.status;\n  }\n\n  return undefined;\n}\n\n/**\n * Extract error type from error.\n */\nfunction extractErrorType(error: unknown): string | undefined {\n  if (!error || typeof error !== \"object\") {\n    return undefined;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  if (typeof err.name === \"string\") {\n    return err.name;\n  }\n\n  if (typeof err.type === \"string\") {\n    return err.type;\n  }\n\n  return undefined;\n}\n\n/**\n * Extract provider info from authentication error.\n */\nfunction extractProviderInfo(error: unknown): string | undefined {\n  if (!error || typeof error !== \"object\") {\n    return undefined;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  if (typeof err.data === \"object\" && err.data !== null) {\n    const data = err.data as Record<string, unknown>;\n    if (typeof data.providerID === \"string\") {\n      return data.providerID;\n    }\n  }\n\n  return undefined;\n}\n\n/**\n * Check if an error is retryable.\n */\nfunction isRetryableError(error: unknown): boolean {\n  // Abort errors are not retryable\n  if (isAbortError(error)) {\n    return false;\n  }\n\n  // Timeout errors are retryable\n  if (isTimeoutError(error)) {\n    return true;\n  }\n\n  // Auth errors are not retryable\n  if (isAuthenticationError(error)) {\n    return false;\n  }\n\n  // Check status code\n  const statusCode = extractStatusCode(error);\n  if (statusCode !== undefined) {\n    // 5xx errors are generally retryable\n    if (statusCode >= 500 && statusCode < 600) {\n      return true;\n    }\n\n    // 429 (rate limit) is retryable\n    if (statusCode === 429) {\n      return true;\n    }\n\n    // 4xx errors (except 429) are generally not retryable\n    if (statusCode >= 400 && statusCode < 500) {\n      return false;\n    }\n  }\n\n  // Default to not retryable\n  return false;\n}\n\n/**\n * Wrap an error in an appropriate AI SDK error type.\n */\nexport function wrapError(\n  error: unknown,\n  metadata?: Partial<OpencodeErrorMetadata>,\n): Error {\n  if (isAuthenticationError(error)) {\n    return createAuthenticationError(error);\n  }\n\n  if (isTimeoutError(error)) {\n    const timeoutMs =\n      metadata?.timeoutMs ??\n      extractTimeoutMs(error) ??\n      DEFAULT_REQUEST_TIMEOUT_MS;\n    return createTimeoutError(timeoutMs, \"request\");\n  }\n\n  return createAPICallError(error, metadata);\n}\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 5000;\n\nfunction extractTimeoutMs(error: unknown): number | undefined {\n  if (!error || typeof error !== \"object\") {\n    return undefined;\n  }\n\n  const err = error as Record<string, unknown>;\n  const maybeTimeout =\n    typeof err.timeoutMs === \"number\"\n      ? err.timeoutMs\n      : typeof err.timeout === \"number\"\n        ? err.timeout\n        : undefined;\n\n  if (maybeTimeout === undefined || !Number.isFinite(maybeTimeout)) {\n    return undefined;\n  }\n\n  return maybeTimeout > 0 ? maybeTimeout : undefined;\n}\n","import type { LanguageModelV3FinishReason } from \"@ai-sdk/provider\";\nimport { isAbortError, isOutputLengthError } from \"./errors.js\";\n\n/**\n * Message info from OpenCode SDK.\n */\nexport interface MessageInfo {\n  error?: {\n    name: string;\n    data?: unknown;\n  };\n  finish?: string;\n}\n\n/**\n * Map OpenCode message info to AI SDK finish reason.\n */\nexport function mapOpencodeFinishReason(\n  message: MessageInfo | undefined,\n): LanguageModelV3FinishReason {\n  if (!message) {\n    return { unified: \"other\", raw: undefined };\n  }\n\n  // Check for errors first\n  if (message.error) {\n    return mapErrorToFinishReason(message.error);\n  }\n\n  // Check finish reason\n  if (message.finish) {\n    return mapFinishToReason(message.finish);\n  }\n\n  // Default to stop if no specific reason\n  return { unified: \"stop\", raw: undefined };\n}\n\n/**\n * Map an error to a finish reason.\n */\nfunction mapErrorToFinishReason(error: {\n  name: string;\n  data?: unknown;\n}): LanguageModelV3FinishReason {\n  const { name } = error;\n\n  switch (name) {\n    case \"MessageAbortedError\":\n      // User cancelled - treat as normal stop\n      return { unified: \"stop\", raw: name };\n\n    case \"MessageOutputLengthError\":\n      // Token limit exceeded\n      return { unified: \"length\", raw: name };\n\n    case \"ContextOverflowError\":\n      return { unified: \"length\", raw: name };\n\n    case \"StructuredOutputError\":\n      return { unified: \"error\", raw: name };\n\n    case \"ProviderAuthError\":\n    case \"APIError\":\n    case \"UnknownError\":\n      // Various API/provider errors\n      return { unified: \"error\", raw: name };\n\n    default:\n      // Unknown error type\n      return { unified: \"error\", raw: name };\n  }\n}\n\n/**\n * Map finish string to finish reason.\n */\nfunction mapFinishToReason(finish: string): LanguageModelV3FinishReason {\n  const normalizedFinish = finish.toLowerCase();\n\n  // Normal completion\n  if (\n    normalizedFinish === \"end_turn\" ||\n    normalizedFinish === \"stop\" ||\n    normalizedFinish === \"end\"\n  ) {\n    return { unified: \"stop\", raw: finish };\n  }\n\n  // Token limit\n  if (normalizedFinish === \"max_tokens\" || normalizedFinish === \"length\") {\n    return { unified: \"length\", raw: finish };\n  }\n\n  // Tool use\n  if (normalizedFinish === \"tool_use\" || normalizedFinish === \"tool_calls\") {\n    return { unified: \"tool-calls\", raw: finish };\n  }\n\n  // Content filter\n  if (normalizedFinish === \"content_filter\" || normalizedFinish === \"safety\") {\n    return { unified: \"content-filter\", raw: finish };\n  }\n\n  // Error states\n  if (normalizedFinish === \"error\") {\n    return { unified: \"error\", raw: finish };\n  }\n\n  // Default to stop for unknown values\n  return { unified: \"other\", raw: finish };\n}\n\n/**\n * Map an error object to a finish reason.\n */\nexport function mapErrorToFinishReasonFromUnknown(\n  error: unknown,\n): LanguageModelV3FinishReason {\n  if (isAbortError(error)) {\n    return { unified: \"stop\", raw: \"abort\" };\n  }\n\n  if (isOutputLengthError(error)) {\n    return { unified: \"length\", raw: \"output-length\" };\n  }\n\n  return { unified: \"error\", raw: \"error\" };\n}\n\n/**\n * Determine if a message has tool calls.\n * Used to determine 'tool-calls' finish reason.\n */\nexport function hasToolCalls(parts: Array<{ type: string }>): boolean {\n  return parts.some((part) => part.type === \"tool\");\n}\n","import type { Logger } from \"./types.js\";\n\n/**\n * Default console-based logger.\n */\nexport const defaultLogger: Logger = {\n  warn: (message: string) => {\n    console.warn(`[opencode-provider] ${message}`);\n  },\n  error: (message: string) => {\n    console.error(`[opencode-provider] ${message}`);\n  },\n  debug: (message: string) => {\n    console.debug(`[opencode-provider] ${message}`);\n  },\n};\n\n/**\n * Silent logger that discards all messages.\n */\nexport const silentLogger: Logger = {\n  warn: () => {},\n  error: () => {},\n  debug: () => {},\n};\n\n/**\n * Get a logger instance.\n * @param logger - Logger instance, false to disable, or undefined for default\n * @param verbose - Enable verbose/debug logging\n */\nexport function getLogger(\n  logger: Logger | false | undefined,\n  verbose?: boolean,\n): Logger {\n  if (logger === false) {\n    return silentLogger;\n  }\n\n  if (logger) {\n    // If verbose is enabled and the provided logger has debug, use it\n    // Otherwise, wrap to add debug support\n    if (verbose && !logger.debug) {\n      return {\n        ...logger,\n        debug: (message: string) => logger.warn(`[DEBUG] ${message}`),\n      };\n    }\n    return logger;\n  }\n\n  // Use default logger, potentially with debug disabled\n  if (!verbose) {\n    return {\n      ...defaultLogger,\n      debug: () => {},\n    };\n  }\n\n  return defaultLogger;\n}\n\n/**\n * Create a verbose logger that prefixes all messages with a context.\n */\nexport function createContextLogger(\n  baseLogger: Logger,\n  context: string,\n): Logger {\n  return {\n    warn: (message: string) => baseLogger.warn(`[${context}] ${message}`),\n    error: (message: string) => baseLogger.error(`[${context}] ${message}`),\n    debug: baseLogger.debug\n      ? (message: string) => baseLogger.debug!(`[${context}] ${message}`)\n      : undefined,\n  };\n}\n\n/**\n * Log a warning about an unsupported feature.\n */\nexport function logUnsupportedFeature(\n  logger: Logger,\n  feature: string,\n  details?: string,\n): void {\n  const message = details\n    ? `Unsupported feature: ${feature} - ${details}`\n    : `Unsupported feature: ${feature}`;\n  logger.warn(message);\n}\n\n/**\n * Log a warning about an unsupported parameter.\n */\nexport function logUnsupportedParameter(\n  logger: Logger,\n  parameter: string,\n  value?: unknown,\n): void {\n  if (value !== undefined) {\n    logger.warn(\n      `Parameter '${parameter}' is not supported by OpenCode (value: ${JSON.stringify(value)})`,\n    );\n  } else {\n    logger.warn(`Parameter '${parameter}' is not supported by OpenCode`);\n  }\n}\n\n/**\n * Log unsupported call options.\n * Returns an array of warning messages for inclusion in the response.\n */\nexport function logUnsupportedCallOptions(\n  logger: Logger,\n  options: {\n    temperature?: number;\n    topP?: number;\n    topK?: number;\n    frequencyPenalty?: number;\n    presencePenalty?: number;\n    stopSequences?: string[];\n    seed?: number;\n    maxTokens?: number;\n  },\n): string[] {\n  const warnings: string[] = [];\n\n  const unsupportedParams = [\n    { name: \"temperature\", value: options.temperature },\n    { name: \"topP\", value: options.topP },\n    { name: \"topK\", value: options.topK },\n    { name: \"frequencyPenalty\", value: options.frequencyPenalty },\n    { name: \"presencePenalty\", value: options.presencePenalty },\n    { name: \"stopSequences\", value: options.stopSequences },\n    { name: \"seed\", value: options.seed },\n    { name: \"maxTokens\", value: options.maxTokens },\n  ];\n\n  for (const param of unsupportedParams) {\n    if (param.value !== undefined) {\n      const warning = `Parameter '${param.name}' is not supported by OpenCode`;\n      logger.warn(warning);\n      warnings.push(warning);\n    }\n  }\n\n  return warnings;\n}\n","import { z } from \"zod\";\nimport type {\n  OpencodeSettings,\n  OpencodeProviderSettings,\n  Logger,\n} from \"./types.js\";\n\n/**\n * Schema for Logger interface.\n */\nconst loggerSchema = z.object({\n  warn: z.any().refine((val) => typeof val === \"function\", {\n    message: \"warn must be a function\",\n  }),\n  error: z.any().refine((val) => typeof val === \"function\", {\n    message: \"error must be a function\",\n  }),\n  debug: z\n    .any()\n    .refine((val) => val === undefined || typeof val === \"function\", {\n      message: \"debug must be a function\",\n    })\n    .optional(),\n});\n\nconst permissionRuleSchema = z.object({\n  permission: z.string(),\n  pattern: z.string(),\n  action: z.enum([\"allow\", \"deny\", \"ask\"]),\n});\n\n/**\n * Schema for OpencodeSettings.\n */\nexport const opcodeSettingsSchema = z.object({\n  sessionId: z.string().optional(),\n  createNewSession: z.boolean().optional(),\n  sessionTitle: z.string().optional(),\n  agent: z.string().optional(),\n  systemPrompt: z.string().optional(),\n  tools: z.record(z.string(), z.boolean()).optional(),\n  permission: z.array(permissionRuleSchema).optional(),\n  variant: z.string().optional(),\n  cwd: z.string().optional(),\n  directory: z.string().optional(),\n  outputFormatRetryCount: z.number().int().nonnegative().optional(),\n  logger: z.union([loggerSchema, z.literal(false)]).optional(),\n  verbose: z.boolean().optional(),\n});\n\n/**\n * Schema for OpencodeProviderSettings.\n */\nexport const opcodeProviderSettingsSchema = z.object({\n  hostname: z.string().optional(),\n  port: z.number().int().positive().optional(),\n  baseUrl: z.string().url().optional(),\n  autoStartServer: z.boolean().optional(),\n  serverTimeout: z.number().int().positive().optional(),\n  clientOptions: z.record(z.string(), z.unknown()).optional(),\n  client: z.object({}).passthrough().optional(),\n  clientManager: z.object({}).passthrough().optional(),\n  defaultSettings: opcodeSettingsSchema.optional(),\n});\n\n/**\n * Validation result with warnings.\n */\nexport interface ValidationResult<T> {\n  value: T;\n  warnings: string[];\n}\n\n/**\n * Validate OpencodeSettings.\n */\nexport function validateSettings(\n  settings: OpencodeSettings | undefined,\n  logger?: Logger | false,\n): ValidationResult<OpencodeSettings> {\n  const warnings: string[] = [];\n\n  if (!settings) {\n    return { value: {}, warnings };\n  }\n\n  // Validate with Zod\n  const result = opcodeSettingsSchema.safeParse(settings);\n\n  if (!result.success) {\n    const issues = result.error.issues.map(\n      (issue) => `${issue.path.join(\".\")}: ${issue.message}`,\n    );\n    warnings.push(`Settings validation warnings: ${issues.join(\"; \")}`);\n  }\n\n  // Validate session ID format if provided\n  if (settings.sessionId && !isValidSessionId(settings.sessionId)) {\n    warnings.push(`Invalid session ID format: ${settings.sessionId}`);\n  }\n\n  if (\n    settings.outputFormatRetryCount !== undefined &&\n    settings.outputFormatRetryCount > 10\n  ) {\n    warnings.push(\n      `outputFormatRetryCount ${settings.outputFormatRetryCount} is high; consider a value between 0 and 5`,\n    );\n  }\n\n  // Log warnings if logger is provided\n  if (logger && warnings.length > 0) {\n    for (const warning of warnings) {\n      logger.warn(warning);\n    }\n  }\n\n  return { value: settings, warnings };\n}\n\n/**\n * Validate OpencodeProviderSettings.\n */\nexport function validateProviderSettings(\n  settings: OpencodeProviderSettings | undefined,\n  logger?: Logger | false,\n): ValidationResult<OpencodeProviderSettings> {\n  const warnings: string[] = [];\n\n  if (!settings) {\n    return { value: {}, warnings };\n  }\n\n  // Validate with Zod\n  const result = opcodeProviderSettingsSchema.safeParse(settings);\n\n  if (!result.success) {\n    const issues = result.error.issues.map(\n      (issue) => `${issue.path.join(\".\")}: ${issue.message}`,\n    );\n    warnings.push(\n      `Provider settings validation warnings: ${issues.join(\"; \")}`,\n    );\n  }\n\n  // Validate port range\n  if (\n    settings.port !== undefined &&\n    (settings.port < 1 || settings.port > 65535)\n  ) {\n    warnings.push(`Port ${settings.port} is outside valid range (1-65535)`);\n  }\n\n  // Validate timeout\n  if (settings.serverTimeout !== undefined && settings.serverTimeout < 1000) {\n    warnings.push(\n      `Server timeout ${settings.serverTimeout}ms is very short, consider at least 5000ms`,\n    );\n  }\n\n  if (settings.clientManager && settings.client) {\n    warnings.push(\n      \"Both clientManager and client were provided; clientManager will be used and client will be ignored.\",\n    );\n  }\n\n  if (settings.client && settings.clientOptions) {\n    warnings.push(\n      \"Both client and clientOptions were provided; clientOptions will be ignored because client takes precedence\",\n    );\n  }\n\n  if (settings.clientOptions) {\n    const options = settings.clientOptions as Record<string, unknown>;\n    if (options.baseUrl !== undefined) {\n      warnings.push(\n        \"clientOptions.baseUrl is ignored; use provider baseUrl or hostname/port instead\",\n      );\n    }\n    if (options.directory !== undefined) {\n      warnings.push(\n        \"clientOptions.directory is ignored; use defaultSettings.directory or per-model directory instead\",\n      );\n    }\n  }\n\n  // Log warnings if logger is provided\n  if (logger && warnings.length > 0) {\n    for (const warning of warnings) {\n      logger.warn(warning);\n    }\n  }\n\n  return { value: settings, warnings };\n}\n\n/**\n * Validate model ID format.\n * @returns Object with providerID and modelID, or null if invalid.\n */\nexport function validateModelId(\n  modelId: string,\n  logger?: Logger | false,\n): { providerID: string; modelID: string } | null {\n  if (!modelId || typeof modelId !== \"string\" || modelId.trim().length === 0) {\n    if (logger) {\n      logger.error(\"Model ID is required and must be a non-empty string\");\n    }\n    return null;\n  }\n\n  const trimmedId = modelId.trim();\n\n  // Check for provider/model format\n  if (trimmedId.includes(\"/\")) {\n    const parts = trimmedId.split(\"/\");\n    if (parts.length === 2 && parts[0] && parts[1]) {\n      return {\n        providerID: parts[0],\n        modelID: parts[1],\n      };\n    }\n    if (logger) {\n      logger.warn(\n        `Model ID \"${modelId}\" contains multiple slashes, using first segment as provider`,\n      );\n    }\n    const firstPart = parts[0];\n    const restParts = parts.slice(1).join(\"/\");\n    return {\n      providerID: firstPart || \"default\",\n      modelID: restParts || trimmedId,\n    };\n  }\n\n  // Just model ID without provider - will use default provider\n  return {\n    providerID: \"\",\n    modelID: trimmedId,\n  };\n}\n\n/**\n * Check if a session ID is valid.\n * Session IDs are typically UUIDs or similar alphanumeric strings.\n */\nexport function isValidSessionId(sessionId: string): boolean {\n  if (!sessionId || typeof sessionId !== \"string\") {\n    return false;\n  }\n\n  // Allow UUIDs, alphanumeric strings, and strings with hyphens/underscores\n  const validPattern = /^[a-zA-Z0-9_-]+$/;\n  return (\n    validPattern.test(sessionId) &&\n    sessionId.length > 0 &&\n    sessionId.length <= 128\n  );\n}\n\n/**\n * Merge settings with defaults.\n */\nexport function mergeSettings(\n  defaults: OpencodeSettings | undefined,\n  overrides: OpencodeSettings | undefined,\n): OpencodeSettings {\n  if (!defaults && !overrides) {\n    return {};\n  }\n\n  if (!defaults) {\n    return { ...overrides };\n  }\n\n  if (!overrides) {\n    return { ...defaults };\n  }\n\n  return {\n    ...defaults,\n    ...overrides,\n    // Merge tools object if both exist\n    tools:\n      defaults.tools || overrides.tools\n        ? { ...defaults.tools, ...overrides.tools }\n        : undefined,\n    permission: overrides.permission ?? defaults.permission,\n  };\n}\n","import type {\n  JSONValue,\n  LanguageModelV3,\n  LanguageModelV3CallOptions,\n  LanguageModelV3Content,\n  LanguageModelV3Prompt,\n  LanguageModelV3StreamPart,\n  LanguageModelV3ToolApprovalResponsePart,\n  LanguageModelV3Usage,\n  SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport { InvalidArgumentError } from \"@ai-sdk/provider\";\nimport type {\n  Logger,\n  OpencodeSettings,\n  ParsedModelId,\n  StreamingUsage,\n} from \"./types.js\";\nimport { OpencodeClientManager } from \"./opencode-client-manager.js\";\nimport { convertToOpencodeMessages } from \"./convert-to-opencode-messages.js\";\nimport {\n  convertEventToStreamParts,\n  createStreamState,\n  createFinishParts,\n  createStreamStartPart,\n  isEventForSession,\n  isSessionComplete,\n  STRUCTURED_OUTPUT_TOOL,\n  type Message,\n  type Part,\n} from \"./convert-from-opencode-events.js\";\nimport { mapOpencodeFinishReason } from \"./map-opencode-finish-reason.js\";\nimport { getLogger, logUnsupportedCallOptions } from \"./logger.js\";\nimport { validateModelId, validateSettings } from \"./validation.js\";\nimport { wrapError, extractErrorMessage, isAbortError } from \"./errors.js\";\nimport {\n  safeStringifyToolInput,\n  planFilePartConversion,\n} from \"./opencode-part-utils.js\";\n\ninterface ToolApprovalResponse {\n  approvalId: string;\n  approved: boolean;\n  reason?: string;\n}\n\ninterface ApprovalClient {\n  permission?: {\n    reply?: (parameters: {\n      requestID: string;\n      reply: \"once\" | \"always\" | \"reject\";\n      message?: string;\n      directory?: string;\n    }) => Promise<unknown> | unknown;\n  };\n}\n\n/**\n * Convert OpenCode token usage to the AI SDK v6 usage shape.\n */\nfunction convertUsage(usage: StreamingUsage): LanguageModelV3Usage {\n  const inputTokensTotal =\n    usage.inputTokens + usage.cachedInputTokens + usage.cachedWriteTokens;\n\n  return {\n    inputTokens: {\n      total: inputTokensTotal,\n      noCache: usage.inputTokens,\n      cacheRead: usage.cachedInputTokens,\n      cacheWrite: usage.cachedWriteTokens,\n    },\n    outputTokens: {\n      total: usage.outputTokens,\n      text: undefined,\n      reasoning: usage.reasoningTokens,\n    },\n    raw: {\n      input_tokens: usage.inputTokens,\n      output_tokens: usage.outputTokens,\n      reasoning_tokens: usage.reasoningTokens,\n      cache_read_input_tokens: usage.cachedInputTokens,\n      cache_write_input_tokens: usage.cachedWriteTokens,\n      total_cost: usage.totalCost,\n    },\n  };\n}\n\nfunction getMessageIDFromProviderOptions(\n  options: LanguageModelV3CallOptions,\n): string | undefined {\n  const messageID = options.providerOptions?.opencode?.messageID;\n\n  if (messageID == null) {\n    return undefined;\n  }\n\n  if (typeof messageID !== \"string\") {\n    throw new InvalidArgumentError({\n      argument: \"providerOptions.opencode.messageID\",\n      message: \"providerOptions.opencode.messageID must be a string\",\n    });\n  }\n\n  if (!messageID.startsWith(\"msg_\")) {\n    throw new InvalidArgumentError({\n      argument: \"providerOptions.opencode.messageID\",\n      message: \"providerOptions.opencode.messageID must start with 'msg_'\",\n    });\n  }\n\n  return messageID;\n}\n\nfunction extractToolApprovalResponses(\n  prompt: LanguageModelV3Prompt,\n): ToolApprovalResponse[] {\n  const responses: ToolApprovalResponse[] = [];\n\n  for (const message of prompt) {\n    if (message.role !== \"tool\") {\n      continue;\n    }\n\n    for (const part of message.content) {\n      if (part.type !== \"tool-approval-response\") {\n        continue;\n      }\n\n      const response = part as LanguageModelV3ToolApprovalResponsePart;\n      responses.push({\n        approvalId: response.approvalId,\n        approved: response.approved,\n        reason: response.reason,\n      });\n    }\n  }\n\n  return responses;\n}\n\n/**\n * OpenCode Language Model implementation of LanguageModelV3.\n */\nexport class OpencodeLanguageModel implements LanguageModelV3 {\n  readonly specificationVersion = \"v3\" as const;\n\n  readonly modelId: string;\n  readonly provider = \"opencode\";\n\n  /**\n   * OpenCode doesn't support URL-based file inputs.\n   * All files must be base64 encoded.\n   */\n  readonly supportedUrls: Record<string, RegExp[]> = {};\n\n  private readonly settings: OpencodeSettings;\n  private readonly logger: Logger;\n  private readonly clientManager: OpencodeClientManager;\n  private sessionId: string | undefined;\n  private sessionInitPromise: Promise<string> | null = null;\n  private repliedApprovalIdsBySession = new Map<string, Set<string>>();\n  private parsedModelId: ParsedModelId;\n\n  constructor(options: {\n    modelId: string;\n    settings: OpencodeSettings;\n    clientManager: OpencodeClientManager;\n  }) {\n    this.modelId = options.modelId;\n    this.settings = options.settings;\n    this.clientManager = options.clientManager;\n    this.logger = getLogger(options.settings.logger, options.settings.verbose);\n\n    const parsed = validateModelId(this.modelId, this.logger);\n    if (!parsed) {\n      throw new Error(`Invalid model ID: ${this.modelId}`);\n    }\n    this.parsedModelId = parsed;\n\n    validateSettings(this.settings, this.logger);\n\n    if (this.settings.sessionId) {\n      this.sessionId = this.settings.sessionId;\n    }\n  }\n\n  /**\n   * Non-streaming generation.\n   */\n  async doGenerate(options: LanguageModelV3CallOptions) {\n    const warnings: SharedV3Warning[] = [];\n\n    const unsupportedWarnings = logUnsupportedCallOptions(this.logger, {\n      temperature: options.temperature,\n      topP: options.topP,\n      topK: options.topK,\n      frequencyPenalty: options.frequencyPenalty,\n      presencePenalty: options.presencePenalty,\n      stopSequences: options.stopSequences,\n      seed: options.seed,\n      maxTokens: options.maxOutputTokens,\n    });\n\n    for (const warning of unsupportedWarnings) {\n      warnings.push({ type: \"other\", message: warning });\n    }\n\n    if (options.tools && options.tools.length > 0) {\n      const toolWarning =\n        \"Custom tool definitions are ignored. OpenCode executes tools server-side.\";\n      this.logger.warn(toolWarning);\n      warnings.push({ type: \"other\", message: toolWarning });\n    }\n\n    const approvalResponses = extractToolApprovalResponses(options.prompt);\n\n    const {\n      parts,\n      systemPrompt,\n      warnings: conversionWarnings,\n    } = convertToOpencodeMessages(options.prompt, {\n      logger: this.logger,\n      // Structured output is enforced via requestBody.format (json_schema).\n      // Avoid duplicating schema instructions as user-visible prompt text.\n      mode: { type: \"regular\" },\n      includeToolApprovalResponsesAsContext: false,\n    });\n\n    for (const warning of conversionWarnings) {\n      warnings.push({ type: \"other\", message: warning });\n    }\n\n    const messageID = getMessageIDFromProviderOptions(options);\n\n    try {\n      if (options.abortSignal?.aborted) {\n        const error = new Error(\"Request aborted\");\n        error.name = \"AbortError\";\n        throw error;\n      }\n\n      const sessionId = await this.getOrCreateSession();\n      const client = await this.clientManager.getClient();\n\n      if (approvalResponses.length > 0) {\n        const approvalWarnings = await this.replyToPendingApprovals(\n          client,\n          sessionId,\n          approvalResponses,\n        );\n        for (const warning of approvalWarnings) {\n          warnings.push({ type: \"other\", message: warning });\n        }\n      }\n\n      const requestBody = this.buildPromptRequestBody(\n        sessionId,\n        parts,\n        systemPrompt,\n        options,\n        messageID,\n      );\n\n      const result = await client.session.prompt(requestBody);\n\n      const data = result.data;\n      if (!data) {\n        throw new Error(\"No response data from OpenCode\");\n      }\n\n      const responseData = data as {\n        info?: Message;\n        parts?: Part[];\n      };\n\n      this.logger.debug?.(\n        `[doGenerate] raw parts from OpenCode: ${JSON.stringify(responseData.parts?.map(p => ({ type: p.type, ...(p.type === 'text' ? { text: (p as any).text?.slice(0, 200) } : {}), ...(p.type === 'tool' ? { tool: (p as any).tool, callID: (p as any).callID, status: (p as any).state?.status, input: (p as any).state?.input } : {}) })))}`,\n      );\n      const content = this.extractContentFromParts(responseData.parts ?? []);\n      this.logger.debug?.(\n        `[doGenerate] extracted content: ${JSON.stringify(content.map(c => ({ type: c.type, ...(c.type === 'text' ? { text: (c as any).text?.slice(0, 200) } : {}), ...(c.type === 'tool-call' ? { toolName: (c as any).toolName } : {}) })))}`,\n      );\n      const usage = this.extractUsageFromParts(responseData.parts ?? []);\n      const finishReason = mapOpencodeFinishReason(responseData.info);\n\n      return {\n        content,\n        finishReason,\n        usage: convertUsage(usage),\n        providerMetadata: {\n          opencode: {\n            sessionId,\n            messageId: responseData.info?.id,\n            cost: usage.totalCost,\n          },\n        },\n        request: { body: requestBody },\n        warnings,\n      };\n    } catch (error) {\n      if (isAbortError(error)) {\n        throw error;\n      }\n\n      throw wrapError(error, {\n        sessionId: this.sessionId,\n      });\n    }\n  }\n\n  /**\n   * Streaming generation.\n   */\n  async doStream(options: LanguageModelV3CallOptions): Promise<{\n    stream: ReadableStream<LanguageModelV3StreamPart>;\n    request?: { body?: unknown };\n    response?: { headers?: Record<string, string> };\n  }> {\n    const warnings: string[] = [];\n\n    const unsupportedWarnings = logUnsupportedCallOptions(this.logger, {\n      temperature: options.temperature,\n      topP: options.topP,\n      topK: options.topK,\n      frequencyPenalty: options.frequencyPenalty,\n      presencePenalty: options.presencePenalty,\n      stopSequences: options.stopSequences,\n      seed: options.seed,\n      maxTokens: options.maxOutputTokens,\n    });\n    warnings.push(...unsupportedWarnings);\n\n    if (options.tools && options.tools.length > 0) {\n      const toolWarning =\n        \"Custom tool definitions are ignored. OpenCode executes tools server-side.\";\n      this.logger.warn(toolWarning);\n      warnings.push(toolWarning);\n    }\n\n    const approvalResponses = extractToolApprovalResponses(options.prompt);\n\n    const {\n      parts,\n      systemPrompt,\n      warnings: conversionWarnings,\n    } = convertToOpencodeMessages(options.prompt, {\n      logger: this.logger,\n      // Structured output is enforced via requestBody.format (json_schema).\n      // Avoid duplicating schema instructions as user-visible prompt text.\n      mode: { type: \"regular\" },\n      includeToolApprovalResponsesAsContext: false,\n    });\n    warnings.push(...conversionWarnings);\n\n    const messageID = getMessageIDFromProviderOptions(options);\n\n    const sessionId = await this.getOrCreateSession();\n    const client = await this.clientManager.getClient();\n\n    const requestBody = this.buildPromptRequestBody(\n      sessionId,\n      parts,\n      systemPrompt,\n      options,\n      messageID,\n    );\n\n    const directory = this.getRequestDirectory();\n    const logger = this.logger;\n\n    const stream = new ReadableStream<LanguageModelV3StreamPart>({\n      start: async (controller) => {\n        const streamWarnings = [...warnings];\n        let streamStartEmitted = false;\n\n        try {\n          const eventsResult = await client.event.subscribe(\n            directory ? { directory } : undefined,\n          );\n\n          const eventStream = eventsResult.stream;\n          if (!eventStream) {\n            throw new Error(\"Failed to subscribe to events\");\n          }\n\n          if (approvalResponses.length > 0) {\n            const approvalWarnings = await this.replyToPendingApprovals(\n              client,\n              sessionId,\n              approvalResponses,\n            );\n            streamWarnings.push(...approvalWarnings);\n          }\n\n          controller.enqueue(createStreamStartPart(streamWarnings));\n          streamStartEmitted = true;\n\n          let resolvePromptFailed: (() => void) | undefined;\n          const promptFailed = new Promise<void>((resolve) => {\n            resolvePromptFailed = resolve;\n          });\n          let resolveAbortRequested: (() => void) | undefined;\n          const abortRequested = new Promise<void>((resolve) => {\n            resolveAbortRequested = resolve;\n          });\n          let removeAbortListener = () => {};\n\n          const abortSignal = options.abortSignal;\n          if (abortSignal) {\n            const onAbort = () => resolveAbortRequested?.();\n            if (abortSignal.aborted) {\n              onAbort();\n            } else {\n              abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n              removeAbortListener = () =>\n                abortSignal.removeEventListener(\"abort\", onAbort);\n            }\n          }\n\n          client.session.prompt(requestBody).catch((error: unknown) => {\n            logger.error(`Prompt error: ${extractErrorMessage(error)}`);\n            controller.enqueue({ type: \"error\", error });\n            resolvePromptFailed?.();\n          });\n\n          const state = createStreamState();\n          let lastMessageInfo: Message | undefined;\n          const iterator = eventStream[Symbol.asyncIterator]();\n          let iteratorClosed = false;\n          const closeIterator = async () => {\n            if (iteratorClosed) {\n              return;\n            }\n            iteratorClosed = true;\n            if (typeof iterator.return === \"function\") {\n              try {\n                await iterator.return(undefined);\n              } catch (closeError) {\n                logger.debug?.(\n                  `Failed to close event stream iterator: ${extractErrorMessage(closeError)}`,\n                );\n              }\n            }\n          };\n\n          try {\n            while (true) {\n              const nextEvent = iterator.next();\n              const result = await Promise.race([\n                nextEvent.then((value) => ({ type: \"event\" as const, value })),\n                promptFailed.then(() => ({ type: \"prompt-failed\" as const })),\n                abortRequested.then(() => ({ type: \"aborted\" as const })),\n              ]);\n\n              if (result.type === \"prompt-failed\") {\n                await closeIterator();\n                break;\n              }\n\n              if (result.type === \"aborted\") {\n                try {\n                  await client.session.abort({\n                    sessionID: sessionId,\n                    ...(directory ? { directory } : {}),\n                  });\n                } catch {\n                  // ignore abort errors\n                }\n                await closeIterator();\n                break;\n              }\n\n              const { done, value: event } = result.value;\n              if (done) {\n                iteratorClosed = true;\n                break;\n              }\n\n              if (!isEventForSession(event, sessionId)) {\n                continue;\n              }\n\n              const streamParts = convertEventToStreamParts(\n                event,\n                state,\n                logger,\n              );\n              for (const part of streamParts) {\n                controller.enqueue(part);\n              }\n\n              if (event.type === \"message.updated\") {\n                const messageEvent = event as { properties: { info: Message } };\n                if (messageEvent.properties.info.role === \"assistant\") {\n                  lastMessageInfo = messageEvent.properties.info;\n                }\n              }\n\n              if (isSessionComplete(event, sessionId)) {\n                const finishReason = mapOpencodeFinishReason(lastMessageInfo);\n                const finishParts = createFinishParts(\n                  state,\n                  finishReason,\n                  sessionId,\n                  lastMessageInfo?.id,\n                );\n                for (const part of finishParts) {\n                  controller.enqueue(part);\n                }\n\n                await closeIterator();\n                break;\n              }\n            }\n          } finally {\n            removeAbortListener();\n            await closeIterator();\n          }\n        } catch (error) {\n          if (!streamStartEmitted) {\n            controller.enqueue(createStreamStartPart(streamWarnings));\n          }\n          if (!isAbortError(error)) {\n            logger.error(`Stream error: ${extractErrorMessage(error)}`);\n            controller.enqueue({ type: \"error\", error: wrapError(error) });\n          }\n        } finally {\n          controller.close();\n        }\n      },\n    });\n\n    return {\n      stream,\n      request: { body: requestBody },\n    };\n  }\n\n  private getRequestDirectory(): string | undefined {\n    return this.settings.directory ?? this.settings.cwd;\n  }\n\n  private getResponseFormat(options: LanguageModelV3CallOptions):\n    | {\n        type: \"json_schema\";\n        schema: Record<string, unknown>;\n        retryCount?: number;\n      }\n    | undefined {\n    if (options.responseFormat?.type !== \"json\") {\n      return undefined;\n    }\n\n    return {\n      type: \"json_schema\",\n      schema: (options.responseFormat.schema ?? {\n        type: \"object\",\n        additionalProperties: true,\n      }) as Record<string, unknown>,\n      ...(this.settings.outputFormatRetryCount !== undefined\n        ? { retryCount: this.settings.outputFormatRetryCount }\n        : {}),\n    };\n  }\n\n  private buildPromptRequestBody(\n    sessionId: string,\n    parts: Array<\n      | { type: \"text\"; text: string }\n      | { type: \"file\"; mime: string; url: string; filename?: string }\n    >,\n    systemPrompt: string | undefined,\n    options: LanguageModelV3CallOptions,\n    messageID: string | undefined,\n  ) {\n    const format = this.getResponseFormat(options);\n    const directory = this.getRequestDirectory();\n\n    return {\n      sessionID: sessionId,\n      ...(directory ? { directory } : {}),\n      ...(this.parsedModelId.providerID\n        ? {\n            model: {\n              providerID: this.parsedModelId.providerID,\n              modelID: this.parsedModelId.modelID,\n            },\n          }\n        : {}),\n      ...(this.settings.agent ? { agent: this.settings.agent } : {}),\n      ...(this.settings.tools ? { tools: this.settings.tools } : {}),\n      ...(format ? { format } : {}),\n      ...((systemPrompt ?? this.settings.systemPrompt)\n        ? { system: systemPrompt ?? this.settings.systemPrompt }\n        : {}),\n      ...(this.settings.variant ? { variant: this.settings.variant } : {}),\n      ...(messageID ? { messageID } : {}),\n      parts,\n    };\n  }\n\n  private async replyToPendingApprovals(\n    client: ApprovalClient,\n    sessionId: string,\n    responses: ToolApprovalResponse[],\n  ): Promise<string[]> {\n    const permissionApi = client.permission;\n\n    if (typeof permissionApi?.reply !== \"function\") {\n      return [\n        \"OpenCode permission.reply is unavailable; tool approval responses were ignored.\",\n      ];\n    }\n\n    const warnings: string[] = [];\n    const directory = this.getRequestDirectory();\n    const repliedApprovalIds = this.getRepliedApprovalIdsForSession(sessionId);\n    const pendingResponses = this.getPendingApprovalResponses(\n      responses,\n      repliedApprovalIds,\n    );\n\n    for (const response of pendingResponses) {\n      try {\n        await permissionApi.reply({\n          requestID: response.approvalId,\n          reply: response.approved ? \"once\" : \"reject\",\n          ...(response.reason ? { message: response.reason } : {}),\n          ...(directory ? { directory } : {}),\n        });\n        repliedApprovalIds.add(response.approvalId);\n      } catch (error) {\n        const warning =\n          `Failed to apply tool approval response for ${response.approvalId}: ` +\n          `${extractErrorMessage(error)}`;\n        this.logger.warn(warning);\n        warnings.push(warning);\n      }\n    }\n\n    return warnings;\n  }\n\n  private getPendingApprovalResponses(\n    responses: ToolApprovalResponse[],\n    repliedApprovalIds: Set<string>,\n  ): ToolApprovalResponse[] {\n    const seenInRequest = new Set<string>();\n    const pending: ToolApprovalResponse[] = [];\n\n    for (const response of responses) {\n      if (seenInRequest.has(response.approvalId)) {\n        continue;\n      }\n      seenInRequest.add(response.approvalId);\n\n      if (repliedApprovalIds.has(response.approvalId)) {\n        continue;\n      }\n\n      pending.push(response);\n    }\n\n    return pending;\n  }\n\n  private getRepliedApprovalIdsForSession(sessionId: string): Set<string> {\n    const existing = this.repliedApprovalIdsBySession.get(sessionId);\n    if (existing) {\n      return existing;\n    }\n\n    const created = new Set<string>();\n    this.repliedApprovalIdsBySession.set(sessionId, created);\n    return created;\n  }\n\n  /**\n   * Get or create a session for this model instance.\n   */\n  private async getOrCreateSession(): Promise<string> {\n    if (this.sessionId && !this.settings.createNewSession) {\n      return this.sessionId;\n    }\n\n    if (!this.settings.createNewSession && this.sessionInitPromise) {\n      return this.sessionInitPromise;\n    }\n\n    const createSession = async (): Promise<string> => {\n      const client = await this.clientManager.getClient();\n      const directory = this.getRequestDirectory();\n      const result = await client.session.create({\n        ...(directory ? { directory } : {}),\n        title: this.settings.sessionTitle ?? \"AI SDK Session\",\n        ...(this.settings.permission\n          ? { permission: this.settings.permission }\n          : {}),\n      });\n\n      const data = result.data as { id: string } | undefined;\n      if (!data?.id) {\n        throw new Error(\n          `Failed to create session: ${JSON.stringify(result.error ?? result.data)}`,\n        );\n      }\n\n      this.sessionId = data.id;\n      this.logger.debug?.(`Created session: ${this.sessionId}`);\n\n      return this.sessionId;\n    };\n\n    if (this.settings.createNewSession) {\n      return createSession();\n    }\n\n    const pending = createSession();\n    this.sessionInitPromise = pending;\n    try {\n      return await pending;\n    } finally {\n      if (this.sessionInitPromise === pending) {\n        this.sessionInitPromise = null;\n      }\n    }\n  }\n\n  /**\n   * Extract content in AI SDK format from OpenCode parts.\n   */\n  private extractContentFromParts(parts: Part[]): LanguageModelV3Content[] {\n    const content: LanguageModelV3Content[] = [];\n\n    for (const part of parts) {\n      if (\n        part.type === \"text\" &&\n        typeof (part as { text?: string }).text === \"string\"\n      ) {\n        if (\n          !(part as { synthetic?: boolean }).synthetic &&\n          !(part as { ignored?: boolean }).ignored\n        ) {\n          content.push({\n            type: \"text\",\n            text: (part as { text: string }).text,\n          });\n        }\n        continue;\n      }\n\n      if (\n        part.type === \"reasoning\" &&\n        typeof (part as { text?: string }).text === \"string\"\n      ) {\n        content.push({\n          type: \"reasoning\",\n          text: (part as { text: string }).text,\n        });\n        continue;\n      }\n\n      if (part.type === \"tool\") {\n        const toolParts = this.extractToolParts(part);\n        content.push(...toolParts);\n        continue;\n      }\n\n      if (part.type === \"file\") {\n        content.push(...this.convertFilePartToContent(part));\n      }\n    }\n\n    return content;\n  }\n\n  private extractToolParts(part: Part): LanguageModelV3Content[] {\n    const toolParts: LanguageModelV3Content[] = [];\n    const toolPart = part as {\n      callID: string;\n      tool: string;\n      state: {\n        status: string;\n        input: Record<string, unknown>;\n        output?: string;\n        error?: string;\n        attachments?: Array<Part>;\n      };\n    };\n\n    if (toolPart.state.status === \"completed\") {\n      // OpenCode's StructuredOutput tool carries the structured JSON in its\n      // input. The AI SDK expects structured output as text content so that\n      // `Output.object()` / `Output.array()` can parse it via `step.text`.\n      // Emit the tool input as a text part instead of tool-call/tool-result.\n      if (toolPart.tool === STRUCTURED_OUTPUT_TOOL) {\n        const serialized = safeStringifyToolInput(toolPart.state.input, (message) => {\n          this.logger.warn(\n            `Failed to serialize StructuredOutput input for ${toolPart.callID}: ${message}`,\n          );\n        });\n        this.logger.debug?.(\n          `[StructuredOutput doGenerate] callID=${toolPart.callID} status=${toolPart.state.status} raw input=${JSON.stringify(toolPart.state.input)} serialized=${serialized}`,\n        );\n        toolParts.push({ type: \"text\", text: serialized });\n        return toolParts;\n      }\n\n      toolParts.push({\n        type: \"tool-call\",\n        toolCallId: toolPart.callID,\n        toolName: toolPart.tool,\n        input: safeStringifyToolInput(toolPart.state.input, (message) => {\n          this.logger.warn(\n            `Failed to serialize tool input for ${toolPart.callID}: ${message}`,\n          );\n        }),\n        providerExecuted: true,\n        dynamic: true,\n      });\n\n      toolParts.push({\n        type: \"tool-result\",\n        toolCallId: toolPart.callID,\n        toolName: toolPart.tool,\n        result: (toolPart.state.output ?? \"\") as NonNullable<JSONValue>,\n        dynamic: true,\n      });\n\n      const attachments = toolPart.state.attachments ?? [];\n      for (const attachment of attachments) {\n        if (attachment.type === \"file\") {\n          toolParts.push(...this.convertFilePartToContent(attachment));\n        }\n      }\n    } else if (toolPart.state.status === \"error\") {\n      // Don't emit tool-call/tool-result for StructuredOutput errors —\n      // the StructuredOutputError finish reason handles this.\n      if (toolPart.tool === STRUCTURED_OUTPUT_TOOL) {\n        return toolParts;\n      }\n\n      toolParts.push({\n        type: \"tool-call\",\n        toolCallId: toolPart.callID,\n        toolName: toolPart.tool,\n        input: safeStringifyToolInput(toolPart.state.input, (message) => {\n          this.logger.warn(\n            `Failed to serialize tool input for ${toolPart.callID}: ${message}`,\n          );\n        }),\n        providerExecuted: true,\n        dynamic: true,\n      });\n\n      toolParts.push({\n        type: \"tool-result\",\n        toolCallId: toolPart.callID,\n        toolName: toolPart.tool,\n        result: (toolPart.state.error ??\n          \"Unknown error\") as NonNullable<JSONValue>,\n        isError: true,\n        dynamic: true,\n      });\n    }\n\n    return toolParts;\n  }\n\n  private convertFilePartToContent(part: Part): LanguageModelV3Content[] {\n    const filePart = part as {\n      id?: string;\n      mime?: string;\n      filename?: string;\n      url?: string;\n      source?: Record<string, unknown>;\n    };\n\n    if (!filePart.url || !filePart.mime) {\n      this.logger.debug?.(\n        `Skipping file part with missing metadata: url=${String(filePart.url)} mime=${String(filePart.mime)}`,\n      );\n      return [];\n    }\n\n    const { plan, error } = planFilePartConversion(filePart);\n    if (!plan) {\n      if (error === \"invalid-data-url\") {\n        this.logger.debug?.(\n          `Skipping file part with invalid data URL: ${filePart.url.slice(0, 80)}`,\n        );\n      }\n      return [];\n    }\n\n    const content: LanguageModelV3Content[] = [];\n\n    if (plan.primary.type === \"file\") {\n      content.push({\n        type: \"file\",\n        mediaType: plan.primary.mediaType,\n        data: plan.primary.data,\n        ...(plan.sourceMetadata\n          ? {\n              providerMetadata: {\n                opencode: {\n                  source: plan.sourceMetadata as unknown as JSONValue,\n                },\n              },\n            }\n          : {}),\n      });\n    } else if (plan.primary.type === \"source-url\") {\n      content.push({\n        type: \"source\",\n        sourceType: \"url\",\n        id: plan.primary.id,\n        url: plan.primary.url,\n        ...(plan.primary.title ? { title: plan.primary.title } : {}),\n      });\n    } else {\n      content.push({\n        type: \"source\",\n        sourceType: \"document\",\n        id: plan.primary.id,\n        mediaType: plan.primary.mediaType,\n        title: plan.primary.title,\n        ...(plan.primary.filename ? { filename: plan.primary.filename } : {}),\n        ...(plan.sourceMetadata\n          ? {\n              providerMetadata: {\n                opencode: {\n                  source: plan.sourceMetadata as unknown as JSONValue,\n                },\n              },\n            }\n          : {}),\n      });\n    }\n\n    if (plan.secondaryDocumentSource) {\n      content.push({\n        type: \"source\",\n        sourceType: \"document\",\n        id: plan.secondaryDocumentSource.id,\n        mediaType: plan.secondaryDocumentSource.mediaType,\n        title: plan.secondaryDocumentSource.title,\n        ...(plan.secondaryDocumentSource.filename\n          ? { filename: plan.secondaryDocumentSource.filename }\n          : {}),\n        ...(plan.sourceMetadata\n          ? {\n              providerMetadata: {\n                opencode: {\n                  source: plan.sourceMetadata as unknown as JSONValue,\n                },\n              },\n            }\n          : {}),\n      });\n    }\n\n    return content;\n  }\n\n  /**\n   * Extract usage information from step-finish parts.\n   */\n  private extractUsageFromParts(parts: Part[]): StreamingUsage {\n    const usage: StreamingUsage = {\n      inputTokens: 0,\n      outputTokens: 0,\n      reasoningTokens: 0,\n      cachedInputTokens: 0,\n      cachedWriteTokens: 0,\n      totalCost: 0,\n    };\n\n    for (const part of parts) {\n      if (part.type === \"step-finish\") {\n        const stepPart = part as {\n          cost: number;\n          tokens: {\n            input: number;\n            output: number;\n            reasoning: number;\n            cache: { read: number; write: number };\n          };\n        };\n\n        usage.inputTokens += stepPart.tokens.input;\n        usage.outputTokens += stepPart.tokens.output;\n        usage.reasoningTokens += stepPart.tokens.reasoning;\n        usage.cachedInputTokens += stepPart.tokens.cache.read;\n        usage.cachedWriteTokens += stepPart.tokens.cache.write;\n        usage.totalCost += stepPart.cost;\n      }\n    }\n\n    return usage;\n  }\n\n  /**\n   * Get the current session ID.\n   */\n  getSessionId(): string | undefined {\n    return this.sessionId;\n  }\n}\n","import type {\n  Logger,\n  OpencodeClient,\n  OpencodeClientOptions,\n  OpencodeCreateClientOptions,\n  OpencodeProviderSettings,\n} from \"./types.js\";\nimport { getLogger } from \"./logger.js\";\nimport { createTimeoutError, extractErrorMessage } from \"./errors.js\";\n\ntype OpencodeServer = Awaited<\n  ReturnType<typeof import(\"@opencode-ai/sdk/v2\").createOpencodeServer>\n>;\n\n/**\n * Options for creating a client manager.\n */\nexport interface ClientManagerOptions {\n  hostname?: string;\n  port?: number;\n  baseUrl?: string;\n  autoStartServer?: boolean;\n  serverTimeout?: number;\n  cwd?: string;\n  clientOptions?: OpencodeClientOptions;\n  client?: OpencodeClient;\n  logger?: Logger | false;\n}\n\n/**\n * Manages the OpenCode server and client lifecycle.\n * Uses singleton pattern to ensure only one server instance per process.\n */\nexport class OpencodeClientManager {\n  private static instance: OpencodeClientManager | null = null;\n\n  private client: OpencodeClient | null = null;\n  private server: OpencodeServer | null = null;\n  private options: ClientManagerOptions;\n  private logger: Logger;\n  private initPromise: Promise<OpencodeClient> | null = null;\n  private isDisposed = false;\n  private cleanupHandlersRegistered = false;\n  private cleanupHandlers: {\n    exit?: () => void;\n    sigint?: () => void;\n    sigterm?: () => void;\n    uncaughtException?: (error: Error) => void;\n  } = {};\n\n  private constructor(options: ClientManagerOptions) {\n    // Filter out undefined values to prevent them from overwriting defaults\n    const filteredOptions = Object.fromEntries(\n      Object.entries(options).filter(([_, v]) => v !== undefined),\n    ) as ClientManagerOptions;\n\n    this.options = {\n      hostname: \"127.0.0.1\",\n      port: 4096,\n      autoStartServer: true,\n      serverTimeout: 10000,\n      ...filteredOptions,\n    };\n    this.logger = getLogger(options.logger);\n\n    // Register cleanup on process exit\n    this.registerCleanupHandlers();\n  }\n\n  /**\n   * Get the singleton instance of the client manager.\n   */\n  static getInstance(options?: ClientManagerOptions): OpencodeClientManager {\n    if (!OpencodeClientManager.instance) {\n      OpencodeClientManager.instance = new OpencodeClientManager(options ?? {});\n    } else if (options) {\n      // Update options if provided\n      OpencodeClientManager.instance.updateOptions(options);\n    }\n    return OpencodeClientManager.instance;\n  }\n\n  /**\n   * Create a standalone (non-singleton) client manager instance.\n   * Use this when you need isolated client managers, e.g. for concurrent\n   * sessions pointing at different servers.\n   */\n  static createInstance(options: ClientManagerOptions): OpencodeClientManager {\n    return new OpencodeClientManager(options);\n  }\n\n  /**\n   * Reset the singleton instance.\n   * Used primarily for testing.\n   */\n  static resetInstance(): void {\n    if (OpencodeClientManager.instance) {\n      OpencodeClientManager.instance.dispose().catch(() => {});\n      OpencodeClientManager.instance = null;\n    }\n  }\n\n  /**\n   * Update options for the client manager.\n   */\n  private updateOptions(options: ClientManagerOptions): void {\n    // Only update if client hasn't been initialized yet\n    if (!this.client && !this.initPromise) {\n      // Filter out undefined values to prevent them from overwriting existing options\n      const filteredOptions = Object.fromEntries(\n        Object.entries(options).filter(([_, v]) => v !== undefined),\n      ) as ClientManagerOptions;\n\n      this.options = {\n        ...this.options,\n        ...filteredOptions,\n      };\n      this.logger = getLogger(options.logger ?? this.options.logger);\n      return;\n    }\n\n    const filteredOptions = Object.fromEntries(\n      Object.entries(options).filter(([_, v]) => v !== undefined),\n    ) as ClientManagerOptions;\n\n    if (Object.keys(filteredOptions).length === 0) {\n      return;\n    }\n\n    if (\n      filteredOptions.client &&\n      this.client &&\n      filteredOptions.client !== this.client\n    ) {\n      this.logger.warn(\n        \"Client manager already initialized; provided preconfigured client was ignored because a client is already active. New options from createOpencode() are ignored after initialization. Use separate client manager instances or call dispose() first.\",\n      );\n      return;\n    }\n\n    this.logger.warn(\n      \"Client manager already initialized; new options from createOpencode() were ignored. Use separate client manager instances or call dispose() first.\",\n    );\n  }\n\n  /**\n   * Get or create the OpenCode client.\n   * Will start the server if autoStartServer is true and server isn't running.\n   */\n  async getClient(): Promise<OpencodeClient> {\n    if (this.isDisposed) {\n      throw new Error(\"Client manager has been disposed\");\n    }\n\n    if (this.client) {\n      return this.client;\n    }\n\n    // If initialization is already in progress, wait for it\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    // Start initialization\n    this.initPromise = this.initializeClient();\n\n    try {\n      this.client = await this.initPromise;\n      return this.client;\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Initialize the client and optionally the server.\n   */\n  private async initializeClient(): Promise<OpencodeClient> {\n    if (this.options.client) {\n      if (this.options.clientOptions) {\n        this.logger.warn(\n          \"Both client and clientOptions were provided; clientOptions will be ignored because client takes precedence.\",\n        );\n      }\n      this.logger.debug?.(\"Using preconfigured OpenCode client\");\n      return this.options.client;\n    }\n\n    const { createOpencodeClient, createOpencodeServer } =\n      await import(\"@opencode-ai/sdk/v2\");\n\n    // Check if we should use an external URL\n    if (this.options.baseUrl) {\n      this.logger.debug?.(\n        `Connecting to external OpenCode server at ${this.options.baseUrl}`,\n      );\n      return createOpencodeClient(\n        this.createManagedClientOptions(this.options.baseUrl),\n      );\n    }\n\n    const serverUrl = `http://${this.options.hostname}:${this.options.port}`;\n\n    // Try to connect to existing server first\n    if (await this.isServerRunning(serverUrl)) {\n      this.logger.debug?.(\n        `Connected to existing OpenCode server at ${serverUrl}`,\n      );\n      return createOpencodeClient(this.createManagedClientOptions(serverUrl));\n    }\n\n    // Start server if autoStart is enabled\n    if (this.options.autoStartServer) {\n      this.logger.debug?.(`Starting OpenCode server at ${serverUrl}`);\n\n      try {\n        this.server = await createOpencodeServer({\n          hostname: this.options.hostname,\n          port: this.options.port,\n          timeout: this.options.serverTimeout,\n        });\n\n        this.logger.debug?.(`OpenCode server started at ${this.server.url}`);\n\n        return createOpencodeClient(\n          this.createManagedClientOptions(this.server.url),\n        );\n      } catch (error) {\n        const message = extractErrorMessage(error);\n\n        if (message.includes(\"Timeout\")) {\n          throw createTimeoutError(\n            this.options.serverTimeout ?? 10000,\n            \"server startup\",\n          );\n        }\n\n        throw new Error(`Failed to start OpenCode server: ${message}`);\n      }\n    }\n\n    throw new Error(\n      `No OpenCode server running at ${serverUrl} and autoStartServer is disabled`,\n    );\n  }\n\n  /**\n   * Check if an OpenCode server is running at the given URL.\n   */\n  private async isServerRunning(baseUrl: string): Promise<boolean> {\n    try {\n      const response = await fetch(`${baseUrl}/health`, {\n        method: \"GET\",\n        signal: AbortSignal.timeout(2000),\n      });\n      return response.ok;\n    } catch {\n      // If health endpoint doesn't exist, try the config endpoint\n      try {\n        const response = await fetch(`${baseUrl}/config`, {\n          method: \"GET\",\n          signal: AbortSignal.timeout(2000),\n        });\n        return response.ok;\n      } catch {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * Build client options with manager-owned baseUrl and directory.\n   */\n  private createManagedClientOptions(baseUrl: string): OpencodeCreateClientOptions {\n    const options = this.options.clientOptions ?? {};\n    const optionsRecord = options as Record<string, unknown>;\n\n    if (optionsRecord.baseUrl !== undefined) {\n      this.logger.warn(\n        \"Ignoring clientOptions.baseUrl because provider baseUrl/hostname/port controls server routing.\",\n      );\n    }\n    if (optionsRecord.directory !== undefined) {\n      this.logger.warn(\n        \"Ignoring clientOptions.directory because directory is managed by model settings/defaultSettings.\",\n      );\n    }\n\n    return {\n      ...options,\n      baseUrl,\n      directory: this.options.cwd,\n    };\n  }\n\n  /**\n   * Get the server URL.\n   */\n  getServerUrl(): string {\n    if (this.server) {\n      return this.server.url;\n    }\n    if (this.options.baseUrl) {\n      return this.options.baseUrl;\n    }\n    return `http://${this.options.hostname}:${this.options.port}`;\n  }\n\n  /**\n   * Check if the server was started by this manager.\n   */\n  isServerManaged(): boolean {\n    return this.server !== null;\n  }\n\n  /**\n   * Dispose of the client manager, stopping the server if managed.\n   */\n  async dispose(): Promise<void> {\n    if (this.isDisposed) {\n      return;\n    }\n\n    this.isDisposed = true;\n    this.unregisterCleanupHandlers();\n\n    if (this.server) {\n      this.logger.debug?.(\"Stopping managed OpenCode server\");\n      try {\n        this.server.close();\n      } catch (error) {\n        this.logger.warn(\n          `Error stopping server: ${extractErrorMessage(error)}`,\n        );\n      }\n      this.server = null;\n    }\n\n    this.client = null;\n    this.initPromise = null;\n  }\n\n  /**\n   * Register cleanup handlers for process exit.\n   */\n  private registerCleanupHandlers(): void {\n    if (this.cleanupHandlersRegistered) {\n      return;\n    }\n\n    const cleanup = () => {\n      if (this.server) {\n        try {\n          this.server.close();\n        } catch {\n          // Ignore errors during cleanup\n        }\n      }\n    };\n\n    const handleSigint = () => {\n      cleanup();\n      process.exit(0);\n    };\n\n    const handleSigterm = () => {\n      cleanup();\n      process.exit(0);\n    };\n\n    const handleUncaughtException = (error: Error) => {\n      this.logger.error(`Uncaught exception: ${error.message}`);\n      cleanup();\n      process.exit(1);\n    };\n\n    this.cleanupHandlers = {\n      exit: cleanup,\n      sigint: handleSigint,\n      sigterm: handleSigterm,\n      uncaughtException: handleUncaughtException,\n    };\n\n    // Handle various exit signals\n    process.once(\"exit\", cleanup);\n    process.once(\"SIGINT\", handleSigint);\n    process.once(\"SIGTERM\", handleSigterm);\n    process.once(\"uncaughtException\", handleUncaughtException);\n    this.cleanupHandlersRegistered = true;\n  }\n\n  private unregisterCleanupHandlers(): void {\n    if (!this.cleanupHandlersRegistered) {\n      return;\n    }\n\n    const { exit, sigint, sigterm, uncaughtException } = this.cleanupHandlers;\n\n    if (exit) {\n      process.removeListener(\"exit\", exit);\n    }\n    if (sigint) {\n      process.removeListener(\"SIGINT\", sigint);\n    }\n    if (sigterm) {\n      process.removeListener(\"SIGTERM\", sigterm);\n    }\n    if (uncaughtException) {\n      process.removeListener(\"uncaughtException\", uncaughtException);\n    }\n\n    this.cleanupHandlers = {};\n    this.cleanupHandlersRegistered = false;\n  }\n}\n\n/**\n * Create a client manager instance.\n * This is a convenience function that returns a singleton.\n */\nexport function createClientManager(\n  options?: ClientManagerOptions,\n): OpencodeClientManager {\n  return OpencodeClientManager.getInstance(options);\n}\n\n/**\n * Create a client manager from provider settings.\n */\nexport function createClientManagerFromSettings(\n  settings: OpencodeProviderSettings,\n  logger?: Logger | false,\n): OpencodeClientManager {\n  return OpencodeClientManager.getInstance({\n    hostname: settings.hostname,\n    port: settings.port,\n    baseUrl: settings.baseUrl,\n    autoStartServer: settings.autoStartServer,\n    serverTimeout: settings.serverTimeout,\n    clientOptions: settings.clientOptions,\n    client: settings.client,\n    // Prefer explicit v2 directory setting; fall back to legacy cwd.\n    cwd: settings.defaultSettings?.directory ?? settings.defaultSettings?.cwd,\n    logger,\n  });\n}\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport type {\n  OpencodeModelId,\n  OpencodeSettings,\n  OpencodeProviderSettings,\n  OpencodeProvider,\n} from \"./types.js\";\nimport { OpencodeLanguageModel } from \"./opencode-language-model.js\";\nimport {\n  OpencodeClientManager,\n  createClientManagerFromSettings,\n} from \"./opencode-client-manager.js\";\nimport { validateProviderSettings, mergeSettings } from \"./validation.js\";\nimport { getLogger } from \"./logger.js\";\n\n/**\n * Create an OpenCode provider.\n *\n * @param options - Provider settings\n * @returns OpenCode provider instance\n *\n * @example\n * ```ts\n * import { createOpencode } from 'ai-sdk-provider-opencode-sdk';\n *\n * const opencode = createOpencode();\n * const model = opencode('anthropic/claude-opus-4-5-20251101');\n *\n * // Or with settings\n * const opencode = createOpencode({\n *   hostname: 'localhost',\n *   port: 4096,\n *   defaultSettings: { agent: 'build' }\n * });\n * ```\n */\nexport function createOpencode(\n  options?: OpencodeProviderSettings,\n): OpencodeProvider {\n  const logger = getLogger(options?.defaultSettings?.logger);\n\n  // Validate provider settings\n  validateProviderSettings(options, logger);\n\n  // Use explicit client manager if provided, otherwise use singleton\n  const clientManager = options?.clientManager ?? createClientManagerFromSettings(options ?? {}, logger);\n\n  /**\n   * Create a language model instance.\n   */\n  const createModel = (\n    modelId: OpencodeModelId,\n    settings?: OpencodeSettings,\n  ): LanguageModelV3 => {\n    // Merge default settings with provided settings\n    const mergedSettings = mergeSettings(options?.defaultSettings, settings);\n\n    return new OpencodeLanguageModel({\n      modelId,\n      settings: mergedSettings,\n      clientManager,\n    });\n  };\n\n  // Create provider function that's also an object with methods\n  const provider = Object.assign(\n    // Main callable function\n    (\n      modelId: OpencodeModelId,\n      settings?: OpencodeSettings,\n    ): LanguageModelV3 => {\n      return createModel(modelId, settings);\n    },\n    {\n      // languageModel method\n      languageModel: (\n        modelId: OpencodeModelId,\n        settings?: OpencodeSettings,\n      ): LanguageModelV3 => {\n        return createModel(modelId, settings);\n      },\n\n      // chat alias for languageModel\n      chat: (\n        modelId: OpencodeModelId,\n        settings?: OpencodeSettings,\n      ): LanguageModelV3 => {\n        return createModel(modelId, settings);\n      },\n\n      // Provider info\n      provider: \"opencode\" as const,\n      specificationVersion: \"v3\" as const,\n\n      // Required ProviderV3 methods that are not supported\n      embeddingModel: (modelId: string): never => {\n        throw new NoSuchModelError({ modelId, modelType: \"embeddingModel\" });\n      },\n      imageModel: (modelId: string): never => {\n        throw new NoSuchModelError({ modelId, modelType: \"imageModel\" });\n      },\n\n      // Get the client manager (for advanced usage)\n      getClientManager: (): OpencodeClientManager => {\n        return clientManager;\n      },\n\n      // Dispose resources\n      dispose: async (): Promise<void> => {\n        await clientManager.dispose();\n      },\n    },\n  );\n\n  return provider as OpencodeProvider;\n}\n\n/**\n * Default OpenCode provider instance.\n *\n * @example\n * ```ts\n * import { opencode } from 'ai-sdk-provider-opencode-sdk';\n *\n * const model = opencode('anthropic/claude-opus-4-5-20251101');\n * ```\n */\nexport const opencode = createOpencode();\n\n/**\n * Common model shortcuts for convenience.\n * Model IDs sourced from official documentation:\n * - Anthropic: https://platform.claude.com/docs/en/about-claude/models/overview\n * - Google: https://ai.google.dev/gemini-api/docs/models\n * - OpenAI: https://platform.openai.com/docs/models\n */\nexport const OpencodeModels = {\n  // Anthropic models (Claude 4.5 series - latest)\n  \"claude-sonnet-4-5\": \"anthropic/claude-sonnet-4-5-20250929\",\n  \"claude-haiku-4-5\": \"anthropic/claude-haiku-4-5-20251001\",\n  \"claude-opus-4-5\": \"anthropic/claude-opus-4-5-20251101\",\n\n  // OpenAI models\n  \"gpt-4o\": \"openai/gpt-4o\",\n  \"gpt-4o-mini\": \"openai/gpt-4o-mini\",\n\n  // Google Gemini models\n  \"gemini-3-pro\": \"google/gemini-3-pro-preview\",\n  \"gemini-2.5-flash\": \"google/gemini-2.5-flash\",\n  \"gemini-2.5-pro\": \"google/gemini-2.5-pro\",\n  \"gemini-2.0-flash\": \"google/gemini-2.0-flash\",\n} as const;\n\nexport type OpencodeModelShortcut = keyof typeof OpencodeModels;\n"]}