{"version":3,"sources":["../../src/types/utils.ts","../../src/streaming/AIStream.ts","../../src/streaming/token-counter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Type utilities for AI Kit\n * Provides branded types, type guards, and utility types for type-safe development\n */\n\n// ============================================================================\n// Branded Types\n// ============================================================================\n\n/**\n * Creates a branded type to prevent accidental mixing of similar primitive types\n */\ndeclare const brand: unique symbol;\n\nexport type Brand<T, TBrand extends string> = T & { readonly [brand]: TBrand };\n\n/**\n * User identifier - branded string to prevent mixing with other IDs\n */\nexport type UserId = Brand<string, 'UserId'>;\n\n/**\n * Session identifier - branded string for session management\n */\nexport type SessionId = Brand<string, 'SessionId'>;\n\n/**\n * Message identifier - branded string for message tracking\n */\nexport type MessageId = Brand<string, 'MessageId'>;\n\n/**\n * Agent identifier - branded string for agent identification\n */\nexport type AgentId = Brand<string, 'AgentId'>;\n\n/**\n * Model identifier - branded string for AI model identification\n */\nexport type ModelId = Brand<string, 'ModelId'>;\n\n/**\n * Tool identifier - branded string for tool identification\n */\nexport type ToolId = Brand<string, 'ToolId'>;\n\n/**\n * Conversation identifier - branded string for conversation tracking\n */\nexport type ConversationId = Brand<string, 'ConversationId'>;\n\n/**\n * Timestamp in milliseconds - branded number for time values\n */\nexport type Timestamp = Brand<number, 'Timestamp'>;\n\n/**\n * Helper function to create branded IDs\n */\nexport function createBrandedId<T extends string>(\n  value: string,\n  _brand?: T\n): Brand<string, T> {\n  return value as Brand<string, T>;\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Makes all properties in T deeply partial\n */\nexport type DeepPartial<T> = T extends object\n  ? {\n      [P in keyof T]?: DeepPartial<T[P]>;\n    }\n  : T;\n\n/**\n * Makes all properties in T deeply readonly\n */\nexport type DeepReadonly<T> = T extends object\n  ? {\n      readonly [P in keyof T]: DeepReadonly<T[P]>;\n    }\n  : T;\n\n/**\n * Makes all properties in T deeply required\n */\nexport type DeepRequired<T> = T extends object\n  ? {\n      [P in keyof T]-?: DeepRequired<T[P]>;\n    }\n  : T;\n\n/**\n * Requires at least one property from Keys to be present\n */\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<\n  T,\n  Exclude<keyof T, Keys>\n> &\n  {\n    [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;\n  }[Keys];\n\n/**\n * Requires exactly one property from Keys to be present\n */\nexport type RequireExactlyOne<T, Keys extends keyof T = keyof T> = Pick<\n  T,\n  Exclude<keyof T, Keys>\n> &\n  {\n    [K in Keys]: Required<Pick<T, K>> &\n      Partial<Record<Exclude<Keys, K>, never>>;\n  }[Keys];\n\n/**\n * Makes specified properties optional\n */\nexport type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Makes specified properties required\n */\nexport type RequiredBy<T, K extends keyof T> = Omit<T, K> &\n  Required<Pick<T, K>>;\n\n/**\n * Extracts keys of T where the value is of type V\n */\nexport type KeysOfType<T, V> = {\n  [K in keyof T]: T[K] extends V ? K : never;\n}[keyof T];\n\n/**\n * Makes properties K mutable (removes readonly)\n */\nexport type Mutable<T, K extends keyof T = keyof T> = Omit<T, K> & {\n  -readonly [P in K]: T[P];\n};\n\n/**\n * Creates a union of all possible paths through an object\n */\nexport type Paths<T, D extends number = 3> = [D] extends [never]\n  ? never\n  : T extends object\n  ? {\n      [K in keyof T]-?: K extends string | number\n        ? `${K}` | (Paths<T[K], Prev[D]> extends infer R ? `${K}.${R & string}` : never)\n        : never;\n    }[keyof T]\n  : never;\n\ntype Prev = [never, 0, 1, 2, 3, ...0[]];\n\n/**\n * Gets the value type at a given path in an object\n */\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n  ? K extends keyof T\n    ? PathValue<T[K], Rest>\n    : never\n  : P extends keyof T\n  ? T[P]\n  : never;\n\n/**\n * Converts union type to intersection type\n */\nexport type UnionToIntersection<U> = (\n  U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n  ? I\n  : never;\n\n/**\n * Gets the last element of a union type\n */\nexport type LastOf<T> = UnionToIntersection<\n  T extends unknown ? () => T : never\n> extends () => infer R\n  ? R\n  : never;\n\n/**\n * Converts a union to a tuple\n */\nexport type UnionToTuple<T, L = LastOf<T>> = [T] extends [never]\n  ? []\n  : [...UnionToTuple<Exclude<T, L>>, L];\n\n/**\n * Non-nullable version of T\n */\nexport type NonNullable<T> = T extends null | undefined ? never : T;\n\n/**\n * Nullable version of T\n */\nexport type Nullable<T> = T | null;\n\n/**\n * Maybe version of T (nullable or undefined)\n */\nexport type Maybe<T> = T | null | undefined;\n\n/**\n * Awaited type - extracts the type a Promise resolves to\n */\nexport type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;\n\n/**\n * JSON-serializable types\n */\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonObject = { [key: string]: JsonValue };\nexport type JsonArray = JsonValue[];\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * Ensures a type is JSON-serializable\n */\nexport type Jsonable<T> = T extends JsonValue\n  ? T\n  : T extends { toJSON(): infer R }\n  ? R\n  : never;\n\n/**\n * Extracts all string literal types from a type\n */\nexport type StringLiteral<T> = T extends string\n  ? string extends T\n    ? never\n    : T\n  : never;\n\n/**\n * Extracts all number literal types from a type\n */\nexport type NumberLiteral<T> = T extends number\n  ? number extends T\n    ? never\n    : T\n  : never;\n\n/**\n * Makes a type writable (removes readonly at all levels)\n */\nexport type Writable<T> = { -readonly [P in keyof T]: T[P] };\n\n/**\n * Ensures a function type\n */\nexport type Fn<Args extends unknown[] = unknown[], R = unknown> = (\n  ...args: Args\n) => R;\n\n/**\n * Ensures an async function type\n */\nexport type AsyncFn<Args extends unknown[] = unknown[], R = unknown> = (\n  ...args: Args\n) => Promise<R>;\n\n/**\n * Extracts the parameters of a function type\n */\nexport type FunctionParams<T> = T extends (...args: infer P) => unknown\n  ? P\n  : never;\n\n/**\n * Extracts the return type of a function\n */\nexport type FunctionReturn<T> = T extends (...args: unknown[]) => infer R\n  ? R\n  : never;\n\n/**\n * Creates a type with all properties set to undefined\n */\nexport type AllUndefined<T> = {\n  [P in keyof T]: undefined;\n};\n\n/**\n * Flattens nested Pick types\n */\nexport type FlatPick<T, K extends keyof T> = {\n  [P in K]: T[P];\n};\n\n/**\n * Creates a strict version of Omit that ensures keys exist\n */\nexport type StrictOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\n\n/**\n * Creates a strict version of Pick that ensures keys exist\n */\nexport type StrictPick<T, K extends keyof T> = Pick<T, K>;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n  return value !== null && value !== undefined;\n}\n\n/**\n * Type guard to check if value is null or undefined\n */\nexport function isNullish(value: unknown): value is null | undefined {\n  return value === null || value === undefined;\n}\n\n/**\n * Type guard to check if value is a string\n */\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string';\n}\n\n/**\n * Type guard to check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n  return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Type guard to check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean';\n}\n\n/**\n * Type guard to check if value is an object (excluding null and arrays)\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Type guard to check if value is an array\n */\nexport function isArray<T = unknown>(value: unknown): value is T[] {\n  return Array.isArray(value);\n}\n\n/**\n * Type guard to check if value is a function\n */\nexport function isFunction(value: unknown): value is Fn {\n  return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is a Promise\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n  return (\n    value instanceof Promise ||\n    (isObject(value) &&\n      'then' in value &&\n      typeof value['then'] === 'function')\n  );\n}\n\n/**\n * Type guard to check if value is an Error\n */\nexport function isError(value: unknown): value is Error {\n  return value instanceof Error;\n}\n\n/**\n * Type guard to check if value has a specific property\n */\nexport function hasProperty<K extends string>(\n  value: unknown,\n  property: K\n): value is Record<K, unknown> {\n  return isObject(value) && property in value;\n}\n\n/**\n * Type guard to check if value is a non-empty string\n */\nexport function isNonEmptyString(value: unknown): value is string {\n  return isString(value) && value.length > 0;\n}\n\n/**\n * Type guard to check if value is a non-empty array\n */\nexport function isNonEmptyArray<T>(value: unknown): value is [T, ...T[]] {\n  return isArray<T>(value) && value.length > 0;\n}\n\n/**\n * Type guard to check if value is JSON-serializable\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n  if (value === null) return true;\n\n  const type = typeof value;\n  if (type === 'string' || type === 'number' || type === 'boolean') {\n    return true;\n  }\n\n  if (Array.isArray(value)) {\n    return value.every(isJsonValue);\n  }\n\n  if (type === 'object') {\n    return Object.values(value as object).every(isJsonValue);\n  }\n\n  return false;\n}\n\n/**\n * Type predicate to filter null/undefined values from arrays\n */\nexport function notNullish<T>(value: T | null | undefined): value is T {\n  return !isNullish(value);\n}\n\n// ============================================================================\n// Assertion Functions\n// ============================================================================\n\n/**\n * Asserts that a condition is true, throwing an error otherwise\n */\nexport function assert(\n  condition: unknown,\n  message = 'Assertion failed'\n): asserts condition {\n  if (!condition) {\n    throw new Error(message);\n  }\n}\n\n/**\n * Asserts that a value is defined (not null or undefined)\n */\nexport function assertDefined<T>(\n  value: T | null | undefined,\n  message = 'Value must be defined'\n): asserts value is T {\n  if (!isDefined(value)) {\n    throw new Error(message);\n  }\n}\n\n/**\n * Asserts that a value is a string\n */\nexport function assertString(\n  value: unknown,\n  message = 'Value must be a string'\n): asserts value is string {\n  if (!isString(value)) {\n    throw new Error(message);\n  }\n}\n\n/**\n * Asserts that a value is a number\n */\nexport function assertNumber(\n  value: unknown,\n  message = 'Value must be a number'\n): asserts value is number {\n  if (!isNumber(value)) {\n    throw new Error(message);\n  }\n}\n\n/**\n * Asserts that a value is an object\n */\nexport function assertObject(\n  value: unknown,\n  message = 'Value must be an object'\n): asserts value is Record<string, unknown> {\n  if (!isObject(value)) {\n    throw new Error(message);\n  }\n}\n\n/**\n * Asserts that a value is never reached (useful for exhaustive checks)\n */\nexport function assertNever(value: never, message?: string): never {\n  throw new Error(\n    message ?? `Unexpected value: ${JSON.stringify(value)}`\n  );\n}\n\n// ============================================================================\n// Nominal Types\n// ============================================================================\n\n/**\n * Creates a nominal type that is distinct from its base type\n */\nexport type Nominal<T, Name extends string> = T & {\n  readonly __nominal: Name;\n};\n\n/**\n * Email address - nominal string type\n */\nexport type Email = Nominal<string, 'Email'>;\n\n/**\n * URL - nominal string type\n */\nexport type Url = Nominal<string, 'Url'>;\n\n/**\n * ISO 8601 date string - nominal string type\n */\nexport type ISODateString = Nominal<string, 'ISODateString'>;\n\n/**\n * UUID - nominal string type\n */\nexport type UUID = Nominal<string, 'UUID'>;\n\n/**\n * Positive integer - nominal number type\n */\nexport type PositiveInt = Nominal<number, 'PositiveInt'>;\n\n/**\n * Non-negative integer - nominal number type\n */\nexport type NonNegativeInt = Nominal<number, 'NonNegativeInt'>;\n\n// ============================================================================\n// Discriminated Unions\n// ============================================================================\n\n/**\n * Helper to create discriminated union types\n */\nexport type DiscriminatedUnion<\n  K extends string,\n  T extends Record<K, string>\n> = T;\n\n/**\n * Extracts a specific variant from a discriminated union\n */\nexport type ExtractVariant<\n  Union,\n  Discriminator extends string,\n  Value extends string\n> = Extract<Union, Record<Discriminator, Value>>;\n\n/**\n * Gets all possible values of a discriminator field\n */\nexport type DiscriminatorValues<\n  Union,\n  Discriminator extends string\n> = Union extends Record<Discriminator, infer V> ? V : never;\n\n// ============================================================================\n// Result Type (for error handling)\n// ============================================================================\n\n/**\n * Success result type\n */\nexport interface Success<T> {\n  readonly success: true;\n  readonly data: T;\n}\n\n/**\n * Failure result type\n */\nexport interface Failure<E = Error> {\n  readonly success: false;\n  readonly error: E;\n}\n\n/**\n * Result type for operations that can fail\n */\nexport type Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * Creates a success result\n */\nexport function success<T>(data: T): Success<T> {\n  return { success: true, data };\n}\n\n/**\n * Creates a failure result\n */\nexport function failure<E = Error>(error: E): Failure<E> {\n  return { success: false, error };\n}\n\n/**\n * Type guard for success results\n */\nexport function isSuccess<T, E>(\n  result: Result<T, E>\n): result is Success<T> {\n  return result.success;\n}\n\n/**\n * Type guard for failure results\n */\nexport function isFailure<T, E>(\n  result: Result<T, E>\n): result is Failure<E> {\n  return !result.success;\n}\n\n// ============================================================================\n// Option Type (for nullable values)\n// ============================================================================\n\n/**\n * Some value type\n */\nexport interface Some<T> {\n  readonly kind: 'some';\n  readonly value: T;\n}\n\n/**\n * None value type\n */\nexport interface None {\n  readonly kind: 'none';\n}\n\n/**\n * Option type for values that may not exist\n */\nexport type Option<T> = Some<T> | None;\n\n/**\n * Creates a Some option\n */\nexport function some<T>(value: T): Some<T> {\n  return { kind: 'some', value };\n}\n\n/**\n * Creates a None option\n */\nexport function none(): None {\n  return { kind: 'none' };\n}\n\n/**\n * Type guard for Some options\n */\nexport function isSome<T>(option: Option<T>): option is Some<T> {\n  return option.kind === 'some';\n}\n\n/**\n * Type guard for None options\n */\nexport function isNone<T>(option: Option<T>): option is None {\n  return option.kind === 'none';\n}\n\n/**\n * Converts a nullable value to an Option\n */\nexport function fromNullable<T>(value: T | null | undefined): Option<T> {\n  return isDefined(value) ? some(value) : none();\n}\n\n/**\n * Converts an Option to a nullable value\n */\nexport function toNullable<T>(option: Option<T>): T | null {\n  return isSome(option) ? option.value : null;\n}\n","import { EventEmitter } from 'events'\nimport { createParser, ParsedEvent, ReconnectInterval } from 'eventsource-parser'\nimport type {\n  Message,\n  Usage,\n  StreamConfig,\n  StreamOptions,\n  RetryConfig,\n  StreamCallbacks,\n} from '../types'\nimport { createBrandedId } from '../types/utils'\n\n/**\n * Extended StreamConfig with callbacks\n */\ninterface AIStreamConfig extends StreamConfig, Partial<StreamCallbacks> {\n  onCost?: (usage: Usage) => void;\n}\n\n/**\n * Event types emitted by AIStream\n */\nexport interface AIStreamEvents {\n  message: (message: Message) => void\n  'streaming-start': () => void\n  'streaming-end': () => void\n  error: (error: Error) => void\n  usage: (usage: Usage) => void\n  reset: () => void\n  token: (token: string) => void\n  retry: (info: { attempt: number; delay: number }) => void\n}\n\n/**\n * Core AI streaming client - framework-agnostic\n * Handles SSE and WebSocket transports with automatic reconnection\n */\nexport class AIStream extends EventEmitter {\n  private messages: Message[] = []\n  private isStreaming = false\n  private currentStreamController: AbortController | null = null\n  private retryCount = 0\n  private usage: Usage = {\n    promptTokens: 0,\n    completionTokens: 0,\n    totalTokens: 0,\n  }\n\n  constructor(\n    private config: AIStreamConfig,\n    _options: StreamOptions = {}\n  ) {\n    super()\n    // Options configuration - reserved for future use\n    // (WebSocket support, custom reconnection strategies, etc.)\n  }\n\n  // EventEmitter method declarations for proper type inference\n  override on<K extends keyof AIStreamEvents>(event: K, listener: AIStreamEvents[K]): this\n  override on(event: string | symbol, listener: (...args: any[]) => void): this {\n    return super.on(event, listener)\n  }\n\n  override emit<K extends keyof AIStreamEvents>(event: K, ...args: Parameters<AIStreamEvents[K]>): boolean\n  override emit(event: string | symbol, ...args: any[]): boolean {\n    return super.emit(event, ...args)\n  }\n\n  override once<K extends keyof AIStreamEvents>(event: K, listener: AIStreamEvents[K]): this\n  override once(event: string | symbol, listener: (...args: any[]) => void): this {\n    return super.once(event, listener)\n  }\n\n  override off<K extends keyof AIStreamEvents>(event: K, listener: AIStreamEvents[K]): this\n  override off(event: string | symbol, listener: (...args: any[]) => void): this {\n    return super.off(event, listener)\n  }\n\n  override removeListener<K extends keyof AIStreamEvents>(event: K, listener: AIStreamEvents[K]): this\n  override removeListener(event: string | symbol, listener: (...args: any[]) => void): this {\n    return super.removeListener(event, listener)\n  }\n\n  override removeAllListeners(event?: string | symbol): this {\n    return super.removeAllListeners(event)\n  }\n\n  /**\n   * Send a message and start streaming the response\n   */\n  async send(content: string): Promise<void> {\n    const userMessage: Message = {\n      id: createBrandedId(this.generateId(), 'MessageId'),\n      role: 'user',\n      content,\n      timestamp: Date.now() as any, // Cast to branded Timestamp type\n    }\n\n    this.messages.push(userMessage)\n    this.emit('message', userMessage)\n\n    await this.streamResponse()\n  }\n\n  /**\n   * Stream the AI response\n   */\n  private async streamResponse(): Promise<void> {\n    this.isStreaming = true\n    this.emit('streaming-start')\n\n    try {\n      await this.makeStreamRequest()\n      this.retryCount = 0 // Reset retry count on success\n    } catch (error) {\n      await this.handleError(error as Error)\n    } finally {\n      this.isStreaming = false\n      this.emit('streaming-end')\n    }\n  }\n\n  /**\n   * Make the streaming request\n   */\n  private async makeStreamRequest(): Promise<void> {\n    this.currentStreamController = new AbortController()\n\n    const response = await fetch(this.config.endpoint, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...this.config.headers,\n      },\n      body: JSON.stringify({\n        messages: this.messages,\n        model: this.config.model,\n        systemPrompt: this.config.systemPrompt,\n        stream: true,\n      }),\n      signal: this.currentStreamController.signal,\n    })\n\n    if (!response.ok) {\n      const errorText = await response.text()\n      throw new Error(`HTTP ${response.status}: ${errorText}`)\n    }\n\n    if (!response.body) {\n      throw new Error('Response body is null')\n    }\n\n    await this.processStream(response.body)\n  }\n\n  /**\n   * Process the SSE stream\n   */\n  private async processStream(stream: ReadableStream<Uint8Array>): Promise<void> {\n    const reader = stream.getReader()\n    const decoder = new TextDecoder()\n    let accumulatedContent = ''\n\n    // Create a mutable copy of the message for accumulation\n    const assistantMessage = {\n      id: createBrandedId(this.generateId(), 'MessageId'),\n      role: 'assistant' as const,\n      content: '',\n      timestamp: Date.now() as any, // Cast to branded Timestamp type\n    }\n\n    const parser = createParser((event: ParsedEvent | ReconnectInterval) => {\n      if (event.type === 'event') {\n        const data = event.data\n\n        if (data === '[DONE]') {\n          return\n        }\n\n        try {\n          const parsed = JSON.parse(data)\n\n          // Handle token\n          if (parsed.token) {\n            accumulatedContent += parsed.token\n            assistantMessage.content = accumulatedContent\n\n            if (this.config.onToken) {\n              this.config.onToken(parsed.token)\n            }\n\n            this.emit('token', parsed.token)\n          }\n\n          // Handle usage/metadata\n          if (parsed.usage) {\n            this.usage = {\n              ...this.usage,\n              ...parsed.usage,\n            }\n\n            if (this.config.onCost) {\n              this.config.onCost(this.usage)\n            }\n\n            this.emit('usage', this.usage)\n          }\n        } catch (e) {\n          console.error('Failed to parse SSE event:', e)\n        }\n      }\n    })\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read()\n\n        if (done) {\n          break\n        }\n\n        const chunk = decoder.decode(value, { stream: true })\n        parser.feed(chunk)\n      }\n\n      // Add the complete message\n      if (assistantMessage.content) {\n        this.messages.push(assistantMessage)\n        this.emit('message', assistantMessage)\n      }\n    } finally {\n      reader.releaseLock()\n    }\n  }\n\n  /**\n   * Handle errors with retry logic\n   */\n  private async handleError(error: Error): Promise<void> {\n    const retryConfig = this.getRetryConfig()\n\n    if (this.shouldRetry(error) && this.retryCount < retryConfig.maxRetries!) {\n      this.retryCount++\n\n      const delay = this.calculateRetryDelay(retryConfig)\n\n      this.emit('retry', { attempt: this.retryCount, delay })\n\n      await new Promise((resolve) => setTimeout(resolve, delay))\n\n      await this.streamResponse()\n    } else {\n      if (this.config.onError) {\n        this.config.onError(error)\n      }\n\n      this.emit('error', error)\n    }\n  }\n\n  /**\n   * Determine if error is retriable\n   */\n  private shouldRetry(error: Error): boolean {\n    // Don't retry on abort\n    if (error.name === 'AbortError') {\n      return false\n    }\n\n    // Retry on network errors or 5xx errors\n    return true\n  }\n\n  /**\n   * Calculate retry delay with backoff\n   */\n  private calculateRetryDelay(config: RetryConfig): number {\n    const { backoff = 'exponential', initialDelay = 1000, maxDelay = 10000 } = config\n\n    let delay: number\n\n    if (backoff === 'exponential') {\n      delay = Math.min(initialDelay * Math.pow(2, this.retryCount - 1), maxDelay)\n    } else {\n      delay = Math.min(initialDelay * this.retryCount, maxDelay)\n    }\n\n    return delay\n  }\n\n  /**\n   * Get retry configuration with defaults\n   */\n  private getRetryConfig(): Required<RetryConfig> {\n    return {\n      enabled: this.config.retry?.enabled ?? true,\n      maxRetries: this.config.retry?.maxRetries ?? 3,\n      maxAttempts: this.config.retry?.maxAttempts ?? 3,\n      backoff: this.config.retry?.backoff ?? 'exponential',\n      backoffMultiplier: this.config.retry?.backoffMultiplier ?? 2,\n      initialDelay: this.config.retry?.initialDelay ?? 1000,\n      maxDelay: this.config.retry?.maxDelay ?? 10000,\n      jitter: this.config.retry?.jitter ?? false,\n      retryableStatusCodes: this.config.retry?.retryableStatusCodes ?? [408, 429, 500, 502, 503, 504],\n      retryableErrors: this.config.retry?.retryableErrors ?? [],\n    }\n  }\n\n  /**\n   * Reset the conversation\n   */\n  reset(): void {\n    this.messages = []\n    this.usage = {\n      promptTokens: 0,\n      completionTokens: 0,\n      totalTokens: 0,\n    }\n    this.emit('reset')\n  }\n\n  /**\n   * Retry the last message\n   */\n  async retry(): Promise<void> {\n    if (this.messages.length === 0) {\n      return\n    }\n\n    // Remove the last assistant message if exists\n    const lastMessage = this.messages[this.messages.length - 1]\n    if (lastMessage && lastMessage.role === 'assistant') {\n      this.messages.pop()\n    }\n\n    await this.streamResponse()\n  }\n\n  /**\n   * Stop the current stream\n   */\n  stop(): void {\n    if (this.currentStreamController) {\n      this.currentStreamController.abort()\n      this.currentStreamController = null\n    }\n    this.isStreaming = false\n  }\n\n  /**\n   * Get current messages\n   */\n  getMessages(): Message[] {\n    return [...this.messages]\n  }\n\n  /**\n   * Get streaming state\n   */\n  getIsStreaming(): boolean {\n    return this.isStreaming\n  }\n\n  /**\n   * Get usage statistics\n   */\n  getUsage(): Usage {\n    return { ...this.usage }\n  }\n\n  /**\n   * Generate unique ID\n   */\n  private generateId(): string {\n    return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n  }\n}\n","import type { Message } from '../types'\nimport type { TokenCount } from '../types/common.d'\n\n/**\n * Token counting utilities\n * Provides accurate token counting for cost estimation\n */\n\n// Approximate token counts (chars / 4 is a rough estimate)\n// For production, integrate with tiktoken or similar\nconst CHARS_PER_TOKEN = 4\n\n// Re-export TokenCount for backwards compatibility\nexport type { TokenCount }\n\n/**\n * Count tokens in text (approximation)\n * For production use, integrate with tiktoken\n */\nexport function countTokens(text: string): TokenCount {\n  const characters = text.length\n  const tokens = Math.ceil(characters / CHARS_PER_TOKEN)\n\n  return { tokens, characters }\n}\n\n/**\n * Count tokens in a message\n */\nexport function countMessageTokens(message: Message): TokenCount {\n  // Add overhead for role, etc. (approximate)\n  const overhead = 4\n\n  // Handle different content types\n  let contentText = ''\n  if (typeof message.content === 'string') {\n    contentText = message.content\n  } else if (Array.isArray(message.content)) {\n    contentText = message.content.map(c => c.type === 'text' ? (c as any).text : '').join('')\n  } else if (message.content && typeof message.content === 'object' && 'text' in message.content) {\n    contentText = (message.content as any).text || ''\n  }\n\n  const contentTokens = countTokens(contentText)\n\n  return {\n    tokens: contentTokens.tokens + overhead,\n    characters: contentTokens.characters,\n  }\n}\n\n/**\n * Count tokens in an array of messages\n */\nexport function countMessagesTokens(messages: Message[]): TokenCount {\n  return messages.reduce(\n    (acc, message) => {\n      const count = countMessageTokens(message)\n      return {\n        tokens: acc.tokens + count.tokens,\n        characters: acc.characters + count.characters,\n      }\n    },\n    { tokens: 0, characters: 0 }\n  )\n}\n\n/**\n * Pricing per model (per 1K tokens)\n */\nexport const MODEL_PRICING = {\n  // OpenAI\n  'gpt-4': { input: 0.03, output: 0.06 },\n  'gpt-4-turbo': { input: 0.01, output: 0.03 },\n  'gpt-3.5-turbo': { input: 0.0005, output: 0.0015 },\n\n  // Anthropic\n  'claude-3-opus': { input: 0.015, output: 0.075 },\n  'claude-3-sonnet': { input: 0.003, output: 0.015 },\n  'claude-3-haiku': { input: 0.00025, output: 0.00125 },\n  'claude-sonnet-4': { input: 0.003, output: 0.015 },\n\n  // Meta\n  'llama-3-70b': { input: 0.0008, output: 0.0008 },\n  'llama-3-8b': { input: 0.0002, output: 0.0002 },\n} as const\n\nexport type ModelName = keyof typeof MODEL_PRICING\n\n/**\n * Calculate cost based on token usage\n */\nexport function calculateCost(\n  promptTokens: number,\n  completionTokens: number,\n  model: ModelName\n): number {\n  const pricing = MODEL_PRICING[model]\n\n  if (!pricing) {\n    console.warn(`Unknown model: ${model}, cost calculation may be inaccurate`)\n    return 0\n  }\n\n  const inputCost = (promptTokens / 1000) * pricing.input\n  const outputCost = (completionTokens / 1000) * pricing.output\n\n  return inputCost + outputCost\n}\n\n/**\n * Estimate tokens for a request\n */\nexport function estimateRequestTokens(\n  messages: Message[],\n  systemPrompt?: string\n): TokenCount {\n  const messagesTokens = countMessagesTokens(messages)\n\n  if (systemPrompt) {\n    const systemTokens = countTokens(systemPrompt)\n    return {\n      tokens: messagesTokens.tokens + systemTokens.tokens,\n      characters: messagesTokens.characters + systemTokens.characters,\n    }\n  }\n\n  return messagesTokens\n}\n"]}