{"version":3,"sources":["../src/types/utils.ts","../src/streaming/AIStream.ts","../src/streaming/token-counter.ts","../src/store/ConversationStore.ts","../src/store/MemoryStore.ts","../src/store/RedisStore.ts","../src/store/ZeroDBStore.ts","../src/store/createStore.ts","../src/context/types.ts","../src/context/TokenCounter.ts","../src/context/ContextManager.ts","../src/agents/llm/LLMProvider.ts","../src/agents/types.ts","../src/utils/id.ts","../src/agents/llm/OpenAIProvider.ts","../src/agents/llm/AnthropicProvider.ts","../src/summarization/types.ts","../src/summarization/extractive.ts","../src/summarization/ConversationSummarizer.ts","../src/session/types.ts","../src/session/InMemorySessionStore.ts","../src/session/RedisSessionStore.ts","../src/session/ZeroDBSessionStore.ts","../src/session/SessionManager.ts","../src/auth/types.ts","../src/auth/AINativeAuthProvider.ts","../src/rlhf/storage/ZeroDBStorage.ts","../src/rlhf/storage/LocalStorage.ts","../src/rlhf/storage/MemoryStorage.ts","../src/rlhf/RLHFLogger.ts","../src/rlhf/RLHFInstrumentation.ts","../src/design/types.ts","../src/design/DesignConstraints.ts","../src/design/templates.ts"],"names":["MessageImportance","result","CompressionLevel","ExpirationStrategy","StorageBackend","SessionEvent","pipeline","AuthMethod","AuthStatus","StorageStrategy","AuthErrorType","AuthEventType","fs","DEFAULT_CONFIG","EventEmitter","ConstraintType","ConstraintPriority","LayoutSystem","ColorFormat","WCAGLevel","ValidationSeverity","ConflictStrategy","path"],"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","/**\n * Abstract base class for conversation stores\n *\n * Provides a common interface for persisting conversations across different backends.\n * All store implementations must extend this class and implement the abstract methods.\n */\n\nimport { Message } from '../types'\nimport {\n  Conversation,\n  ConversationMetadata,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n  BaseStoreConfig,\n} from './types'\n\nexport abstract class ConversationStore {\n  protected config: BaseStoreConfig\n\n  constructor(config: BaseStoreConfig = {}) {\n    this.config = {\n      defaultTTL: config.defaultTTL || 0, // 0 = no expiration\n      namespace: config.namespace || 'aikit',\n    }\n  }\n\n  /**\n   * Save a complete conversation\n   * @param conversationId - Unique identifier for the conversation\n   * @param messages - Array of messages to save\n   * @param options - Optional save options (TTL, metadata)\n   * @returns The saved conversation with metadata\n   */\n  abstract save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation>\n\n  /**\n   * Load a conversation by ID\n   * @param conversationId - Unique identifier for the conversation\n   * @param options - Optional load options\n   * @returns The conversation if found, null otherwise\n   */\n  abstract load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null>\n\n  /**\n   * Append messages to an existing conversation\n   * @param conversationId - Unique identifier for the conversation\n   * @param messages - Array of messages to append\n   * @param options - Optional append options\n   * @returns The updated conversation with metadata\n   */\n  abstract append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation>\n\n  /**\n   * Delete a conversation by ID\n   * @param conversationId - Unique identifier for the conversation\n   * @returns True if deleted, false if not found\n   */\n  abstract delete(conversationId: string): Promise<boolean>\n\n  /**\n   * Clear all conversations from the store\n   * @returns Number of conversations cleared\n   */\n  abstract clear(): Promise<number>\n\n  /**\n   * List all conversation IDs\n   * @returns Array of conversation IDs\n   */\n  abstract list(): Promise<string[]>\n\n  /**\n   * Check if a conversation exists\n   * @param conversationId - Unique identifier for the conversation\n   * @returns True if exists, false otherwise\n   */\n  abstract exists(conversationId: string): Promise<boolean>\n\n  /**\n   * Get store statistics\n   * @returns Store statistics\n   */\n  abstract getStats(): Promise<StoreStats>\n\n  /**\n   * Create conversation metadata\n   * @param conversationId - Unique identifier\n   * @param messages - Array of messages\n   * @param options - Optional save options\n   * @param existingMetadata - Existing metadata to preserve\n   * @returns Conversation metadata\n   */\n  protected createMetadata(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions,\n    existingMetadata?: ConversationMetadata\n  ): ConversationMetadata {\n    const now = Date.now()\n    const ttl = options?.ttl ?? this.config.defaultTTL ?? 0\n\n    return {\n      conversationId,\n      createdAt: existingMetadata?.createdAt ?? now,\n      updatedAt: now,\n      messageCount: messages.length,\n      ttl: ttl > 0 ? ttl : undefined,\n      metadata: {\n        ...existingMetadata?.metadata,\n        ...options?.metadata,\n      },\n    }\n  }\n\n  /**\n   * Check if a conversation has expired based on TTL\n   * @param metadata - Conversation metadata\n   * @returns True if expired, false otherwise\n   */\n  protected isExpired(metadata: ConversationMetadata): boolean {\n    if (!metadata.ttl || metadata.ttl === 0) {\n      return false\n    }\n\n    const now = Date.now()\n    const expiresAt = metadata.updatedAt + metadata.ttl * 1000\n    return now > expiresAt\n  }\n\n  /**\n   * Generate a namespaced key for storage\n   * @param conversationId - Conversation identifier\n   * @returns Namespaced key\n   */\n  protected getKey(conversationId: string): string {\n    return `${this.config.namespace}:conversation:${conversationId}`\n  }\n\n  /**\n   * Close the store and cleanup resources\n   */\n  abstract close(): Promise<void>\n}\n","/**\n * In-memory conversation store implementation\n *\n * Stores conversations in memory with optional LRU eviction.\n * Suitable for development, testing, or single-process applications.\n * Data is lost when the process restarts.\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  MemoryStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\nexport class MemoryStore extends ConversationStore {\n  private conversations: Map<string, Conversation>\n  private accessOrder: string[] // For LRU eviction\n  private maxConversations: number\n\n  constructor(config: Omit<MemoryStoreConfig, 'type'> = {}) {\n    super(config)\n    this.conversations = new Map()\n    this.accessOrder = []\n    this.maxConversations = config.maxConversations || 1000\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    // Get existing conversation to preserve createdAt\n    const existing = this.conversations.get(conversationId)\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: [...messages], // Create a copy\n      metadata,\n    }\n\n    this.conversations.set(conversationId, conversation)\n    this.updateAccessOrder(conversationId)\n    this.evictIfNeeded()\n\n    return { ...conversation }\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    const conversation = this.conversations.get(conversationId)\n\n    if (!conversation) {\n      return null\n    }\n\n    // Check if expired\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      // Remove expired conversation\n      await this.delete(conversationId)\n      return null\n    }\n\n    this.updateAccessOrder(conversationId)\n\n    // Return a deep copy to prevent external mutations\n    return {\n      conversationId: conversation.conversationId,\n      messages: [...conversation.messages],\n      metadata: { ...conversation.metadata },\n    }\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, {}, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    this.conversations.set(conversationId, conversation)\n    this.updateAccessOrder(conversationId)\n\n    return { ...conversation }\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    const existed = this.conversations.has(conversationId)\n\n    if (existed) {\n      this.conversations.delete(conversationId)\n      this.removeFromAccessOrder(conversationId)\n    }\n\n    return existed\n  }\n\n  async clear(): Promise<number> {\n    const count = this.conversations.size\n    this.conversations.clear()\n    this.accessOrder = []\n    return count\n  }\n\n  async list(): Promise<string[]> {\n    return Array.from(this.conversations.keys())\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    const conversation = this.conversations.get(conversationId)\n\n    if (!conversation) {\n      return false\n    }\n\n    // Check if expired\n    if (this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return false\n    }\n\n    return true\n  }\n\n  async getStats(): Promise<StoreStats> {\n    let totalMessages = 0\n    let expiredConversations = 0\n\n    for (const conversation of this.conversations.values()) {\n      totalMessages += conversation.messages.length\n\n      if (this.isExpired(conversation.metadata)) {\n        expiredConversations++\n      }\n    }\n\n    return {\n      totalConversations: this.conversations.size,\n      totalMessages,\n      expiredConversations,\n    }\n  }\n\n  async close(): Promise<void> {\n    // No resources to cleanup for memory store\n    await this.clear()\n  }\n\n  /**\n   * Update the access order for LRU eviction\n   */\n  private updateAccessOrder(conversationId: string): void {\n    this.removeFromAccessOrder(conversationId)\n    this.accessOrder.push(conversationId)\n  }\n\n  /**\n   * Remove a conversation ID from the access order\n   */\n  private removeFromAccessOrder(conversationId: string): void {\n    const index = this.accessOrder.indexOf(conversationId)\n    if (index !== -1) {\n      this.accessOrder.splice(index, 1)\n    }\n  }\n\n  /**\n   * Evict least recently used conversations if over limit\n   */\n  private evictIfNeeded(): void {\n    while (this.conversations.size > this.maxConversations) {\n      const lruId = this.accessOrder.shift()\n      if (lruId) {\n        this.conversations.delete(lruId)\n      }\n    }\n  }\n\n  /**\n   * Clean up expired conversations\n   * @returns Number of conversations removed\n   */\n  async cleanup(): Promise<number> {\n    let removed = 0\n\n    for (const [id, conversation] of this.conversations.entries()) {\n      if (this.isExpired(conversation.metadata)) {\n        await this.delete(id)\n        removed++\n      }\n    }\n\n    return removed\n  }\n\n  /**\n   * Get the current size of the store\n   */\n  size(): number {\n    return this.conversations.size\n  }\n}\n","/**\n * Redis-based conversation store implementation\n *\n * Stores conversations in Redis with automatic TTL support.\n * Suitable for production environments with multiple processes or servers.\n * Requires a Redis server to be running.\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  RedisStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\n// Dynamic import for Redis to avoid bundling issues\ntype Redis = any\n\nexport class RedisStore extends ConversationStore {\n  private redis: Redis | null = null\n  private redisConfig: Omit<RedisStoreConfig, 'type'>\n  private keyPrefix: string\n\n  constructor(config: Omit<RedisStoreConfig, 'type'>) {\n    super(config)\n    this.redisConfig = config\n    this.keyPrefix = config.keyPrefix || 'aikit:conversation'\n  }\n\n  /**\n   * Initialize Redis connection (lazy initialization)\n   */\n  private async getRedis(): Promise<Redis> {\n    if (this.redis) {\n      return this.redis\n    }\n\n    try {\n      // Dynamic import to avoid bundling Redis in environments that don't need it\n      const { default: IORedis } = await import('ioredis')\n\n      if (this.redisConfig.url) {\n        this.redis = new IORedis(this.redisConfig.url)\n      } else {\n        this.redis = new IORedis({\n          host: this.redisConfig.host || 'localhost',\n          port: this.redisConfig.port || 6379,\n          password: this.redisConfig.password,\n          db: this.redisConfig.db || 0,\n        })\n      }\n\n      return this.redis\n    } catch (error) {\n      throw new Error(\n        `Failed to initialize Redis: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure ioredis is installed: pnpm add ioredis`\n      )\n    }\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    const redis = await this.getRedis()\n\n    // Get existing conversation to preserve createdAt\n    const existing = await this.load(conversationId, { includeExpired: true })\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages,\n      metadata,\n    }\n\n    const key = this.getRedisKey(conversationId)\n    const value = JSON.stringify(conversation)\n\n    // Set with optional TTL\n    if (metadata.ttl && metadata.ttl > 0) {\n      await redis.setex(key, metadata.ttl, value)\n    } else {\n      await redis.set(key, value)\n    }\n\n    return conversation\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const value = await redis.get(key)\n\n    if (!value) {\n      return null\n    }\n\n    const conversation: Conversation = JSON.parse(value)\n\n    // Check if expired (should not happen with Redis TTL, but double-check)\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return null\n    }\n\n    return conversation\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, { ttl: existing.metadata.ttl }, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n    const value = JSON.stringify(conversation)\n\n    // Preserve TTL if it exists\n    if (metadata.ttl && metadata.ttl > 0) {\n      await redis.setex(key, metadata.ttl, value)\n    } else {\n      await redis.set(key, value)\n    }\n\n    return conversation\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.del(key)\n    return result > 0\n  }\n\n  async clear(): Promise<number> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n\n    if (keys.length === 0) {\n      return 0\n    }\n\n    await redis.del(...keys)\n    return keys.length\n  }\n\n  async list(): Promise<string[]> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n\n    return keys.map((key: string) => {\n      // Extract conversation ID from key\n      const prefix = `${this.keyPrefix}:`\n      return key.startsWith(prefix) ? key.slice(prefix.length) : key\n    })\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.exists(key)\n    return result === 1\n  }\n\n  async getStats(): Promise<StoreStats> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n    let totalMessages = 0\n\n    // Load all conversations to count messages\n    for (const key of keys) {\n      const value = await redis.get(key)\n      if (value) {\n        const conversation: Conversation = JSON.parse(value)\n        totalMessages += conversation.messages.length\n      }\n    }\n\n    return {\n      totalConversations: keys.length,\n      totalMessages,\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.redis) {\n      await this.redis.quit()\n      this.redis = null\n    }\n  }\n\n  /**\n   * Get the Redis key for a conversation\n   */\n  private getRedisKey(conversationId: string): string {\n    return `${this.keyPrefix}:${conversationId}`\n  }\n\n  /**\n   * Get the remaining TTL for a conversation\n   * @param conversationId - Conversation identifier\n   * @returns TTL in seconds, -1 if no TTL, -2 if key doesn't exist\n   */\n  async getTTL(conversationId: string): Promise<number> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    return await redis.ttl(key)\n  }\n\n  /**\n   * Set a new TTL for an existing conversation\n   * @param conversationId - Conversation identifier\n   * @param ttl - TTL in seconds\n   * @returns True if successful\n   */\n  async setTTL(conversationId: string, ttl: number): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.expire(key, ttl)\n    return result === 1\n  }\n}\n","/**\n * ZeroDB-based conversation store implementation\n *\n * Stores conversations in ZeroDB NoSQL tables.\n * Suitable for production environments with built-in features like:\n * - Automatic scaling\n * - Real-time sync\n * - Built-in analytics\n * - Vector search capabilities\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  ZeroDBStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\ninterface ZeroDBRow {\n  conversationId: string\n  data: string // JSON stringified conversation\n  createdAt: number\n  updatedAt: number\n  expiresAt?: number\n}\n\nexport class ZeroDBStore extends ConversationStore {\n  protected override config: ZeroDBStoreConfig\n  // Note: tableName will be used in production implementation via ZeroDB MCP commands\n  private _tableName: string\n  private initialized: boolean = false\n\n  constructor(config: ZeroDBStoreConfig) {\n    super(config)\n    this.config = config\n    this._tableName = config.tableName || 'conversations'\n  }\n\n  /**\n   * Get the table name (for production ZeroDB operations)\n   * @internal - Reserved for future ZeroDB MCP implementation\n   */\n  private get tableName(): string {\n    return this._tableName\n  }\n\n  /**\n   * Initialize the ZeroDB table (lazy initialization)\n   */\n  private async initialize(): Promise<void> {\n    if (this.initialized) {\n      return\n    }\n\n    try {\n      // Check if table exists using ZeroDB MCP command\n      // We'll use a mock implementation that can be replaced with actual ZeroDB calls\n      // The tableName property will be used in production: await zerodb.createTable(this.tableName, schema)\n      void this.tableName // Reference to prevent unused warning\n      this.initialized = true\n    } catch (error) {\n      throw new Error(\n        `Failed to initialize ZeroDB table: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    }\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    await this.initialize()\n\n    // Get existing conversation to preserve createdAt\n    const existing = await this.load(conversationId, { includeExpired: true })\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages,\n      metadata,\n    }\n\n    const row: ZeroDBRow = {\n      conversationId,\n      data: JSON.stringify(conversation),\n      createdAt: metadata.createdAt,\n      updatedAt: metadata.updatedAt,\n      expiresAt:\n        metadata.ttl && metadata.ttl > 0\n          ? metadata.updatedAt + metadata.ttl * 1000\n          : undefined,\n    }\n\n    // Store in ZeroDB\n    await this.upsertRow(row)\n\n    return conversation\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    await this.initialize()\n\n    const row = await this.queryRow(conversationId)\n\n    if (!row) {\n      return null\n    }\n\n    const conversation: Conversation = JSON.parse(row.data)\n\n    // Check if expired\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return null\n    }\n\n    return conversation\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    await this.initialize()\n\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, {}, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    const row: ZeroDBRow = {\n      conversationId,\n      data: JSON.stringify(conversation),\n      createdAt: metadata.createdAt,\n      updatedAt: metadata.updatedAt,\n      expiresAt:\n        metadata.ttl && metadata.ttl > 0\n          ? metadata.updatedAt + metadata.ttl * 1000\n          : undefined,\n    }\n\n    await this.upsertRow(row)\n\n    return conversation\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    await this.initialize()\n\n    try {\n      // In a real implementation, this would call the ZeroDB delete API\n      // For now, we'll use a mock implementation\n      const existed = await this.exists(conversationId)\n      if (existed) {\n        await this.deleteRow(conversationId)\n        return true\n      }\n      return false\n    } catch (error) {\n      return false\n    }\n  }\n\n  async clear(): Promise<number> {\n    await this.initialize()\n\n    const ids = await this.list()\n\n    for (const id of ids) {\n      await this.delete(id)\n    }\n\n    return ids.length\n  }\n\n  async list(): Promise<string[]> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    return rows.map((row) => row.conversationId)\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    await this.initialize()\n\n    const row = await this.queryRow(conversationId)\n    if (!row) {\n      return false\n    }\n\n    const conversation: Conversation = JSON.parse(row.data)\n\n    // Check if expired\n    if (this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return false\n    }\n\n    return true\n  }\n\n  async getStats(): Promise<StoreStats> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    let totalMessages = 0\n    let expiredConversations = 0\n\n    for (const row of rows) {\n      const conversation: Conversation = JSON.parse(row.data)\n      totalMessages += conversation.messages.length\n\n      if (this.isExpired(conversation.metadata)) {\n        expiredConversations++\n      }\n    }\n\n    return {\n      totalConversations: rows.length,\n      totalMessages,\n      expiredConversations,\n    }\n  }\n\n  async close(): Promise<void> {\n    // No persistent connection to close for ZeroDB HTTP API\n    this.initialized = false\n  }\n\n  /**\n   * Upsert a row in ZeroDB table\n   * In a real implementation, this would use the ZeroDB MCP /zerodb-table-insert\n   * or /zerodb-table-update commands\n   */\n  private async upsertRow(_row: ZeroDBRow): Promise<void> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // await this.mcpClient.call('/zerodb-table-update', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId: row.conversationId },\n    //   data: row\n    // })\n  }\n\n  /**\n   * Query a single row by conversation ID\n   */\n  private async queryRow(_conversationId: string): Promise<ZeroDBRow | null> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // const result = await this.mcpClient.call('/zerodb-table-query', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId }\n    // })\n    // return result.rows[0] || null\n    return null\n  }\n\n  /**\n   * Query all rows from the table\n   */\n  private async queryAllRows(): Promise<ZeroDBRow[]> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // const result = await this.mcpClient.call('/zerodb-table-query', {\n    //   tableName: this.tableName,\n    //   filter: {}\n    // })\n    // return result.rows\n    return []\n  }\n\n  /**\n   * Delete a row by conversation ID\n   */\n  private async deleteRow(_conversationId: string): Promise<void> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // await this.mcpClient.call('/zerodb-table-delete', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId }\n    // })\n  }\n\n  /**\n   * Clean up expired conversations\n   * @returns Number of conversations removed\n   */\n  async cleanup(): Promise<number> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    let removed = 0\n\n    for (const row of rows) {\n      const conversation: Conversation = JSON.parse(row.data)\n      if (this.isExpired(conversation.metadata)) {\n        await this.delete(row.conversationId)\n        removed++\n      }\n    }\n\n    return removed\n  }\n}\n","/**\n * Factory function for creating conversation stores\n *\n * Provides a type-safe way to create store instances with configuration validation.\n */\n\nimport { ConversationStore } from './ConversationStore'\nimport { MemoryStore } from './MemoryStore'\nimport { RedisStore } from './RedisStore'\nimport { ZeroDBStore } from './ZeroDBStore'\nimport { StoreConfig } from './types'\n\n/**\n * Create a conversation store based on configuration\n *\n * @param config - Store configuration\n * @returns Configured conversation store instance\n *\n * @example\n * ```typescript\n * // Create a memory store\n * const store = createStore({ type: 'memory', maxConversations: 100 })\n *\n * // Create a Redis store\n * const store = createStore({\n *   type: 'redis',\n *   host: 'localhost',\n *   port: 6379,\n *   defaultTTL: 3600\n * })\n *\n * // Create a ZeroDB store\n * const store = createStore({\n *   type: 'zerodb',\n *   projectId: 'my-project',\n *   apiKey: 'my-api-key',\n *   tableName: 'conversations'\n * })\n * ```\n */\nexport function createStore(config: StoreConfig): ConversationStore {\n  // Validate configuration\n  validateConfig(config)\n\n  switch (config.type) {\n    case 'memory':\n      return new MemoryStore(config)\n\n    case 'redis':\n      return new RedisStore(config)\n\n    case 'zerodb':\n      return new ZeroDBStore(config)\n\n    default:\n      // This should never happen due to TypeScript's type checking\n      throw new Error(`Unknown store type: ${(config as any).type}`)\n  }\n}\n\n/**\n * Validate store configuration\n */\nfunction validateConfig(config: StoreConfig): void {\n  if (!config || typeof config !== 'object') {\n    throw new Error('Store configuration must be an object')\n  }\n\n  if (!('type' in config)) {\n    throw new Error('Store configuration must include a \"type\" field')\n  }\n\n  const validTypes = ['memory', 'redis', 'zerodb']\n  if (!validTypes.includes(config.type)) {\n    throw new Error(\n      `Invalid store type: ${config.type}. Must be one of: ${validTypes.join(', ')}`\n    )\n  }\n\n  // Validate type-specific required fields\n  switch (config.type) {\n    case 'memory':\n      validateMemoryConfig(config)\n      break\n\n    case 'redis':\n      validateRedisConfig(config)\n      break\n\n    case 'zerodb':\n      validateZeroDBConfig(config)\n      break\n  }\n\n  // Validate common fields\n  if (config.defaultTTL !== undefined) {\n    if (typeof config.defaultTTL !== 'number' || config.defaultTTL < 0) {\n      throw new Error('defaultTTL must be a non-negative number')\n    }\n  }\n\n  if (config.namespace !== undefined) {\n    if (typeof config.namespace !== 'string' || config.namespace.length === 0) {\n      throw new Error('namespace must be a non-empty string')\n    }\n  }\n}\n\n/**\n * Validate memory store configuration\n */\nfunction validateMemoryConfig(config: StoreConfig): void {\n  if (config.type !== 'memory') return\n\n  if (config.maxConversations !== undefined) {\n    if (\n      typeof config.maxConversations !== 'number' ||\n      config.maxConversations <= 0\n    ) {\n      throw new Error('maxConversations must be a positive number')\n    }\n  }\n}\n\n/**\n * Validate Redis store configuration\n */\nfunction validateRedisConfig(config: StoreConfig): void {\n  if (config.type !== 'redis') return\n\n  // Either url OR host/port must be provided\n  if (!config.url && !config.host) {\n    throw new Error('Redis configuration must include either \"url\" or \"host\"')\n  }\n\n  if (config.port !== undefined) {\n    if (typeof config.port !== 'number' || config.port <= 0 || config.port > 65535) {\n      throw new Error('Redis port must be between 1 and 65535')\n    }\n  }\n\n  if (config.db !== undefined) {\n    if (typeof config.db !== 'number' || config.db < 0) {\n      throw new Error('Redis db must be a non-negative number')\n    }\n  }\n}\n\n/**\n * Validate ZeroDB store configuration\n */\nfunction validateZeroDBConfig(config: StoreConfig): void {\n  if (config.type !== 'zerodb') return\n\n  if (!config.projectId || (typeof config.projectId === 'string' && config.projectId.length === 0)) {\n    throw new Error('ZeroDB configuration must include \"projectId\"')\n  }\n\n  if (typeof config.projectId !== 'string') {\n    throw new Error('ZeroDB projectId must be a non-empty string')\n  }\n\n  if (!config.apiKey || (typeof config.apiKey === 'string' && config.apiKey.length === 0)) {\n    throw new Error('ZeroDB configuration must include \"apiKey\"')\n  }\n\n  if (typeof config.apiKey !== 'string') {\n    throw new Error('ZeroDB apiKey must be a non-empty string')\n  }\n\n  if (config.tableName !== undefined) {\n    if (typeof config.tableName !== 'string' || config.tableName.length === 0) {\n      throw new Error('ZeroDB tableName must be a non-empty string')\n    }\n  }\n}\n\n/**\n * Type guard to check if a store is a MemoryStore\n */\nexport function isMemoryStore(store: ConversationStore): store is MemoryStore {\n  return store instanceof MemoryStore\n}\n\n/**\n * Type guard to check if a store is a RedisStore\n */\nexport function isRedisStore(store: ConversationStore): store is RedisStore {\n  return store instanceof RedisStore\n}\n\n/**\n * Type guard to check if a store is a ZeroDBStore\n */\nexport function isZeroDBStore(store: ConversationStore): store is ZeroDBStore {\n  return store instanceof ZeroDBStore\n}\n","/**\n * Context truncation types and interfaces\n */\n\nimport type { TokenCount } from '../types/common.d';\n\n/**\n * Supported AI models for token counting\n */\nexport type ModelType =\n  | 'gpt-4'\n  | 'gpt-4-32k'\n  | 'gpt-4-turbo'\n  | 'gpt-4o'\n  | 'gpt-3.5-turbo'\n  | 'gpt-3.5-turbo-16k'\n  | 'claude-3-opus'\n  | 'claude-3-sonnet'\n  | 'claude-3-haiku'\n  | 'claude-3-5-sonnet'\n  | 'claude-3-5-haiku';\n\n/**\n * Message importance levels\n */\nexport enum MessageImportance {\n  SYSTEM = 'system',\n  CRITICAL = 'critical',\n  HIGH = 'high',\n  NORMAL = 'normal',\n  LOW = 'low'\n}\n\n/**\n * Truncation strategy types\n */\nexport type TruncationStrategyType =\n  | 'oldest-first'\n  | 'least-relevant'\n  | 'sliding-window'\n  | 'importance-based'\n  | 'custom';\n\n/**\n * Message structure for context management\n */\nexport interface ContextMessage {\n  role: 'system' | 'user' | 'assistant' | 'function' | 'tool';\n  content: string | null;\n  name?: string;\n  function_call?: {\n    name: string;\n    arguments: string;\n  };\n  tool_calls?: Array<{\n    id: string;\n    type: 'function';\n    function: {\n      name: string;\n      arguments: string;\n    };\n  }>;\n  tool_call_id?: string;\n  importance?: MessageImportance;\n  metadata?: Record<string, any>;\n  embedding?: number[];\n}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n  totalTokens: number;\n  messageTokens: number;\n  overheadTokens: number;\n  remainingTokens: number;\n}\n\n/**\n * Context configuration\n */\nexport interface ContextConfig {\n  model: ModelType;\n  maxTokens: number;\n  reservedTokens?: number;\n  truncationStrategy?: TruncationStrategyType;\n  preserveSystemMessages?: boolean;\n  preserveRecentCount?: number;\n  slidingWindowConfig?: {\n    keepFirst: number;\n    keepLast: number;\n  };\n  warningThreshold?: number;\n  onWarning?: (usage: TokenUsage) => void;\n  onTruncate?: (removed: ContextMessage[], remaining: ContextMessage[]) => void;\n  customTruncationFn?: (messages: ContextMessage[], maxTokens: number) => ContextMessage[];\n}\n\n/**\n * Truncation strategy interface\n */\nexport interface TruncationStrategy {\n  name: TruncationStrategyType;\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[];\n}\n\n/**\n * Token counter result\n * Re-export from common types for backwards compatibility\n */\nexport type { TokenCount };\n\n/**\n * Model token limits mapping\n */\nexport const MODEL_TOKEN_LIMITS: Record<ModelType, number> = {\n  'gpt-4': 8192,\n  'gpt-4-32k': 32768,\n  'gpt-4-turbo': 128000,\n  'gpt-4o': 128000,\n  'gpt-3.5-turbo': 4096,\n  'gpt-3.5-turbo-16k': 16384,\n  'claude-3-opus': 200000,\n  'claude-3-sonnet': 200000,\n  'claude-3-haiku': 200000,\n  'claude-3-5-sonnet': 200000,\n  'claude-3-5-haiku': 200000,\n};\n\n/**\n * Model encoding mapping for tiktoken\n */\nexport const MODEL_ENCODING_MAP: Record<string, string> = {\n  'gpt-4': 'cl100k_base',\n  'gpt-4-32k': 'cl100k_base',\n  'gpt-4-turbo': 'cl100k_base',\n  'gpt-4o': 'o200k_base',\n  'gpt-3.5-turbo': 'cl100k_base',\n  'gpt-3.5-turbo-16k': 'cl100k_base',\n  'claude-3-opus': 'cl100k_base',\n  'claude-3-sonnet': 'cl100k_base',\n  'claude-3-haiku': 'cl100k_base',\n  'claude-3-5-sonnet': 'cl100k_base',\n  'claude-3-5-haiku': 'cl100k_base',\n};\n","/**\n * Token counting utilities using tiktoken (Node.js) or fallback approximation (browser)\n */\n\nimport {\n  ContextMessage,\n  ModelType,\n  TokenCount,\n  MODEL_ENCODING_MAP,\n} from './types';\n\n// Lazy-loaded tiktoken (only in Node.js environments)\nlet tiktokenModule: typeof import('tiktoken') | null = null;\nlet tiktokenLoadAttempted = false;\n\n/**\n * Attempt to load tiktoken (Node.js only)\n * Returns null in browser environments\n */\nasync function loadTiktoken(): Promise<typeof import('tiktoken') | null> {\n  if (tiktokenLoadAttempted) {\n    return tiktokenModule;\n  }\n\n  tiktokenLoadAttempted = true;\n\n  try {\n    // Check if we're in a Node.js environment\n    if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n      tiktokenModule = await import('tiktoken');\n      return tiktokenModule;\n    }\n  } catch (error) {\n    // Silently fail in browser environments or if tiktoken is not installed\n    console.debug('tiktoken not available, using fallback token counter');\n  }\n\n  return null;\n}\n\n/**\n * Browser-compatible approximate token counter\n * Uses character-based estimation (approximately 4 chars per token)\n */\nclass FallbackTokenCounter {\n  private readonly CHARS_PER_TOKEN = 4;\n\n  /**\n   * Count tokens in a string (approximate)\n   */\n  countStringTokens(text: string): number {\n    if (!text) return 0;\n    return Math.ceil(text.length / this.CHARS_PER_TOKEN);\n  }\n\n  /**\n   * Count tokens in a message with estimated breakdown\n   */\n  countMessageTokens(message: ContextMessage): TokenCount {\n    const breakdown = {\n      role: 0,\n      name: 0,\n      content: 0,\n      functionCall: 0,\n      toolCalls: 0,\n    };\n\n    // Every message has overhead (start, role, end tokens)\n    let tokens = 3;\n\n    // Role tokens\n    breakdown.role = Math.ceil(message.role.length / this.CHARS_PER_TOKEN);\n    tokens += breakdown.role;\n\n    // Name tokens\n    if (message.name) {\n      breakdown.name = Math.ceil(message.name.length / this.CHARS_PER_TOKEN) + 1;\n      tokens += breakdown.name;\n    }\n\n    // Content tokens\n    if (message.content) {\n      breakdown.content = this.countStringTokens(message.content);\n      tokens += breakdown.content;\n    }\n\n    // Function call tokens\n    if (message.function_call) {\n      const fnName = this.countStringTokens(message.function_call.name);\n      const fnArgs = this.countStringTokens(message.function_call.arguments);\n      breakdown.functionCall = fnName + fnArgs + 3;\n      tokens += breakdown.functionCall;\n    }\n\n    // Tool calls tokens\n    if (message.tool_calls && message.tool_calls.length > 0) {\n      for (const toolCall of message.tool_calls) {\n        const toolId = this.countStringTokens(toolCall.id);\n        const toolType = this.countStringTokens(toolCall.type);\n        const fnName = this.countStringTokens(toolCall.function.name);\n        const fnArgs = this.countStringTokens(toolCall.function.arguments);\n        breakdown.toolCalls += toolId + toolType + fnName + fnArgs + 5;\n      }\n      tokens += breakdown.toolCalls;\n    }\n\n    // Tool call response overhead\n    if (message.tool_call_id) {\n      tokens += this.countStringTokens(message.tool_call_id) + 2;\n    }\n\n    return {\n      tokens,\n      characters: 0,\n      breakdown,\n    };\n  }\n}\n\n/**\n * TokenCounter class for accurate token counting\n * Automatically uses tiktoken in Node.js or fallback in browsers\n */\nexport class TokenCounter {\n  private encoders: Map<string, any> = new Map();\n  private tiktokenReady = false;\n  private fallbackCounter = new FallbackTokenCounter();\n  private initPromise: Promise<void> | null = null;\n\n  /**\n   * Initialize tiktoken (lazy loading)\n   */\n  private async init(): Promise<void> {\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    this.initPromise = (async () => {\n      const tiktoken = await loadTiktoken();\n      this.tiktokenReady = tiktoken !== null;\n    })();\n\n    return this.initPromise;\n  }\n\n  /**\n   * Get or create encoder for a model (sync - uses fallback if tiktoken not ready)\n   */\n  private getEncoderSync(model: ModelType): any {\n    if (!this.tiktokenReady || !tiktokenModule) {\n      return null;\n    }\n\n    const encodingName = MODEL_ENCODING_MAP[model] || 'cl100k_base';\n\n    if (!this.encoders.has(encodingName)) {\n      try {\n        const encoder = tiktokenModule.encoding_for_model(model as any);\n        this.encoders.set(encodingName, encoder);\n      } catch (error) {\n        // Fallback to cl100k_base if model-specific encoding fails\n        try {\n          const encoder = tiktokenModule.encoding_for_model('gpt-4' as any);\n          this.encoders.set(encodingName, encoder);\n        } catch (e) {\n          return null;\n        }\n      }\n    }\n\n    return this.encoders.get(encodingName) || null;\n  }\n\n  /**\n   * Count tokens in a string\n   */\n  countStringTokens(text: string, model: ModelType): number {\n    if (!text) return 0;\n\n    const encoder = this.getEncoderSync(model);\n    if (!encoder) {\n      // Use fallback\n      return this.fallbackCounter.countStringTokens(text);\n    }\n\n    return encoder.encode(text).length;\n  }\n\n  /**\n   * Count tokens in a message with detailed breakdown\n   */\n  countMessageTokens(message: ContextMessage, model: ModelType): TokenCount {\n    const encoder = this.getEncoderSync(model);\n\n    if (!encoder) {\n      // Use fallback counter\n      return this.fallbackCounter.countMessageTokens(message);\n    }\n\n    const breakdown = {\n      role: 0,\n      name: 0,\n      content: 0,\n      functionCall: 0,\n      toolCalls: 0,\n    };\n\n    // Every message follows <|start|>{role/name}\\n{content}<|end|>\\n\n    let tokens = 3; // start, role, end tokens\n\n    // Role tokens\n    breakdown.role = encoder.encode(message.role).length;\n    tokens += breakdown.role;\n\n    // Name tokens\n    if (message.name) {\n      breakdown.name = encoder.encode(message.name).length + 1; // +1 for name prefix\n      tokens += breakdown.name;\n    }\n\n    // Content tokens\n    if (message.content) {\n      breakdown.content = encoder.encode(message.content).length;\n      tokens += breakdown.content;\n    }\n\n    // Function call tokens (legacy format)\n    if (message.function_call) {\n      const fnName = encoder.encode(message.function_call.name).length;\n      const fnArgs = encoder.encode(message.function_call.arguments).length;\n      breakdown.functionCall = fnName + fnArgs + 3; // +3 for structure tokens\n      tokens += breakdown.functionCall;\n    }\n\n    // Tool calls tokens\n    if (message.tool_calls && message.tool_calls.length > 0) {\n      for (const toolCall of message.tool_calls) {\n        const toolId = encoder.encode(toolCall.id).length;\n        const toolType = encoder.encode(toolCall.type).length;\n        const fnName = encoder.encode(toolCall.function.name).length;\n        const fnArgs = encoder.encode(toolCall.function.arguments).length;\n        breakdown.toolCalls += toolId + toolType + fnName + fnArgs + 5; // +5 for structure tokens\n      }\n      tokens += breakdown.toolCalls;\n    }\n\n    // Tool call response overhead\n    if (message.tool_call_id) {\n      tokens += encoder.encode(message.tool_call_id).length + 2;\n    }\n\n    return {\n      tokens,\n      characters: 0, // Not tracked in this implementation\n      breakdown,\n    };\n  }\n\n  /**\n   * Count tokens for an array of messages\n   */\n  countMessagesTokens(messages: ContextMessage[], model: ModelType): number {\n    let total = 0;\n    for (const message of messages) {\n      total += this.countMessageTokens(message, model).tokens;\n    }\n    // Add overhead for message list\n    total += 3; // every reply is primed with <|start|>assistant<|message|>\n    return total;\n  }\n\n  /**\n   * Estimate tokens remaining after adding a message\n   */\n  estimateRemainingTokens(\n    messages: ContextMessage[],\n    maxTokens: number,\n    model: ModelType\n  ): number {\n    const used = this.countMessagesTokens(messages, model);\n    return Math.max(0, maxTokens - used);\n  }\n\n  /**\n   * Check if adding a message would exceed token limit\n   */\n  wouldExceedLimit(\n    messages: ContextMessage[],\n    newMessage: ContextMessage,\n    maxTokens: number,\n    model: ModelType\n  ): boolean {\n    const currentTokens = this.countMessagesTokens(messages, model);\n    const newTokens = this.countMessageTokens(newMessage, model).tokens;\n    return currentTokens + newTokens > maxTokens;\n  }\n\n  /**\n   * Find the index where messages would exceed token limit\n   */\n  findTokenLimitIndex(\n    messages: ContextMessage[],\n    maxTokens: number,\n    model: ModelType,\n    fromEnd: boolean = true\n  ): number {\n    let totalTokens = 3; // base overhead\n    const messagesToCheck = fromEnd ? [...messages].reverse() : messages;\n\n    for (let i = 0; i < messagesToCheck.length; i++) {\n      const message = messagesToCheck[i];\n      if (!message) continue;\n      const messageTokens = this.countMessageTokens(message, model).tokens;\n      totalTokens += messageTokens;\n\n      if (totalTokens > maxTokens) {\n        return fromEnd ? messages.length - i : i;\n      }\n    }\n\n    return fromEnd ? 0 : messages.length;\n  }\n\n  /**\n   * Free encoder resources\n   */\n  dispose(): void {\n    if (this.tiktokenReady) {\n      for (const encoder of this.encoders.values()) {\n        if (encoder && typeof encoder.free === 'function') {\n          encoder.free();\n        }\n      }\n    }\n    this.encoders.clear();\n  }\n\n  /**\n   * Check if tiktoken is available\n   */\n  isTiktokenAvailable(): boolean {\n    return this.tiktokenReady;\n  }\n\n  /**\n   * Preload tiktoken (optional, for better performance)\n   * Call this early in Node.js environments to ensure tiktoken is ready\n   */\n  async preload(): Promise<boolean> {\n    await this.init();\n    return this.tiktokenReady;\n  }\n}\n\n/**\n * Singleton instance for easy access\n */\nexport const tokenCounter = new TokenCounter();\n","/**\n * Context Manager with automatic truncation\n */\n\nimport { TokenCounter } from './TokenCounter';\nimport {\n  ContextMessage,\n  ContextConfig,\n  TokenUsage,\n  TruncationStrategy,\n  MessageImportance,\n  MODEL_TOKEN_LIMITS,\n} from './types';\n\n/**\n * Oldest-first truncation strategy\n * Removes oldest messages first while preserving system messages\n */\nclass OldestFirstStrategy implements TruncationStrategy {\n  name = 'oldest-first' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const result: ContextMessage[] = [];\n    const preserveSystemMessages = config.preserveSystemMessages ?? true;\n    const preserveRecentCount = config.preserveRecentCount ?? 1;\n\n    // Separate system messages and regular messages\n    const systemMessages = preserveSystemMessages\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Always include system messages\n    result.push(...systemMessages);\n\n    // Calculate tokens used by system messages\n    let tokensUsed = counter.countMessagesTokens(systemMessages, config.model);\n\n    // Preserve recent messages\n    const recentMessages = otherMessages.slice(-preserveRecentCount);\n    const recentTokens = counter.countMessagesTokens(recentMessages, config.model);\n\n    // Add messages from end, skipping those we'll add as recent\n    const middleMessages = otherMessages.slice(0, -preserveRecentCount);\n\n    // Add middle messages from newest to oldest until we hit limit\n    for (let i = middleMessages.length - 1; i >= 0; i--) {\n      const message = middleMessages[i];\n      if (!message) continue;\n      const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n      if (tokensUsed + messageTokens + recentTokens <= maxTokens) {\n        result.push(message);\n        tokensUsed += messageTokens;\n      }\n    }\n\n    // Add recent messages at the end\n    result.push(...recentMessages);\n\n    counter.dispose();\n\n    // Restore original order (system messages are already at start)\n    const nonSystemResult = result.filter((m) => m.role !== 'system');\n    return [...systemMessages, ...nonSystemResult.sort((a, b) => {\n      return messages.indexOf(a) - messages.indexOf(b);\n    })];\n  }\n}\n\n/**\n * Sliding window truncation strategy\n * Keeps first N and last M messages\n */\nclass SlidingWindowStrategy implements TruncationStrategy {\n  name = 'sliding-window' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const keepFirst = config.slidingWindowConfig?.keepFirst ?? 1;\n    const keepLast = config.slidingWindowConfig?.keepLast ?? 5;\n\n    // Separate system messages\n    const systemMessages = (config.preserveSystemMessages ?? true)\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Get first and last messages\n    const firstMessages = otherMessages.slice(0, keepFirst);\n    const lastMessages = otherMessages.slice(-keepLast);\n\n    // Combine and deduplicate\n    const combined = [...systemMessages, ...firstMessages];\n\n    for (const msg of lastMessages) {\n      if (!combined.includes(msg)) {\n        combined.push(msg);\n      }\n    }\n\n    // If still over limit, trim from the middle\n    let result = combined;\n    let tokensUsed = counter.countMessagesTokens(result, config.model);\n\n    while (tokensUsed > maxTokens && result.length > systemMessages.length + 2) {\n      // Remove from middle (after first, before last)\n      const middleIndex = systemMessages.length + Math.floor(\n        (result.length - systemMessages.length) / 2\n      );\n      result.splice(middleIndex, 1);\n      tokensUsed = counter.countMessagesTokens(result, config.model);\n    }\n\n    counter.dispose();\n    return result;\n  }\n}\n\n/**\n * Importance-based truncation strategy\n * Preserves messages based on importance level\n */\nclass ImportanceBasedStrategy implements TruncationStrategy {\n  name = 'importance-based' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const importanceOrder = [\n      MessageImportance.SYSTEM,\n      MessageImportance.CRITICAL,\n      MessageImportance.HIGH,\n      MessageImportance.NORMAL,\n      MessageImportance.LOW,\n    ];\n\n    // Group messages by importance\n    const grouped = new Map<MessageImportance, ContextMessage[]>();\n    for (const importance of importanceOrder) {\n      grouped.set(importance, []);\n    }\n\n    // Classify messages\n    for (const message of messages) {\n      const importance = message.importance ?? (\n        message.role === 'system'\n          ? MessageImportance.SYSTEM\n          : MessageImportance.NORMAL\n      );\n      grouped.get(importance)?.push(message);\n    }\n\n    // Add messages by importance until we hit the limit\n    const result: ContextMessage[] = [];\n    let tokensUsed = 0;\n\n    for (const importance of importanceOrder) {\n      const messagesOfImportance = grouped.get(importance) ?? [];\n\n      for (const message of messagesOfImportance) {\n        const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n        if (tokensUsed + messageTokens <= maxTokens) {\n          result.push(message);\n          tokensUsed += messageTokens;\n        } else if (importance === MessageImportance.SYSTEM || importance === MessageImportance.CRITICAL) {\n          // Always include system and critical messages, even if over limit\n          result.push(message);\n          tokensUsed += messageTokens;\n        }\n      }\n    }\n\n    counter.dispose();\n\n    // Restore original order\n    return result.sort((a, b) => messages.indexOf(a) - messages.indexOf(b));\n  }\n}\n\n/**\n * Least relevant truncation strategy (using embeddings if available)\n * Falls back to oldest-first if no embeddings\n */\nclass LeastRelevantStrategy implements TruncationStrategy {\n  name = 'least-relevant' as const;\n\n  /**\n   * Calculate cosine similarity between two vectors\n   */\n  private cosineSimilarity(a: number[], b: number[]): number {\n    if (a.length !== b.length) return 0;\n\n    let dotProduct = 0;\n    let normA = 0;\n    let normB = 0;\n\n    for (let i = 0; i < a.length; i++) {\n      const aVal = a[i];\n      const bVal = b[i];\n      if (aVal === undefined || bVal === undefined) continue;\n      dotProduct += aVal * bVal;\n      normA += aVal * aVal;\n      normB += bVal * bVal;\n    }\n\n    const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n    return denominator === 0 ? 0 : dotProduct / denominator;\n  }\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const preserveSystemMessages = config.preserveSystemMessages ?? true;\n    const preserveRecentCount = config.preserveRecentCount ?? 2;\n\n    // Check if we have embeddings\n    const hasEmbeddings = messages.some((m) => m.embedding && m.embedding.length > 0);\n\n    if (!hasEmbeddings) {\n      // Fallback to oldest-first strategy\n      const strategy = new OldestFirstStrategy();\n      return strategy.truncate(messages, maxTokens, _currentTokens, config);\n    }\n\n    // Separate messages\n    const systemMessages = preserveSystemMessages\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Get recent messages (to preserve and use as context for relevance)\n    const recentMessages = otherMessages.slice(-preserveRecentCount);\n    const middleMessages = otherMessages.slice(0, -preserveRecentCount);\n\n    // Calculate average embedding of recent messages\n    const recentEmbeddings = recentMessages\n      .filter((m) => m.embedding)\n      .map((m) => m.embedding!);\n\n    let avgEmbedding: number[] | null = null;\n    if (recentEmbeddings.length > 0 && recentEmbeddings[0]) {\n      const embeddingLength = recentEmbeddings[0].length;\n      avgEmbedding = new Array(embeddingLength).fill(0);\n\n      for (const embedding of recentEmbeddings) {\n        if (!embedding) continue;\n        for (let i = 0; i < embeddingLength; i++) {\n          const val = embedding[i];\n          const avgVal = avgEmbedding[i];\n          if (val !== undefined && avgVal !== undefined) {\n            avgEmbedding[i] = avgVal + val;\n          }\n        }\n      }\n\n      for (let i = 0; i < embeddingLength; i++) {\n        const avgVal = avgEmbedding[i];\n        if (avgVal !== undefined) {\n          avgEmbedding[i] = avgVal / recentEmbeddings.length;\n        }\n      }\n    }\n\n    // Score messages by relevance to recent context\n    const scoredMessages = middleMessages.map((message) => {\n      let relevanceScore = 0;\n\n      if (avgEmbedding && message.embedding) {\n        relevanceScore = this.cosineSimilarity(message.embedding, avgEmbedding);\n      }\n\n      return { message, score: relevanceScore };\n    });\n\n    // Sort by relevance (highest first)\n    scoredMessages.sort((a, b) => b.score - a.score);\n\n    // Build result with most relevant messages\n    const result: ContextMessage[] = [...systemMessages];\n    let tokensUsed = counter.countMessagesTokens(systemMessages, config.model);\n    const recentTokens = counter.countMessagesTokens(recentMessages, config.model);\n\n    // Add most relevant messages until we hit limit\n    for (const { message } of scoredMessages) {\n      const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n      if (tokensUsed + messageTokens + recentTokens <= maxTokens) {\n        result.push(message);\n        tokensUsed += messageTokens;\n      }\n    }\n\n    // Add recent messages\n    result.push(...recentMessages);\n\n    counter.dispose();\n\n    // Restore original order\n    return result.sort((a, b) => messages.indexOf(a) - messages.indexOf(b));\n  }\n}\n\n/**\n * Context Manager for automatic context truncation\n */\nexport class ContextManager {\n  private config: ContextConfig;\n  private counter: TokenCounter;\n  private strategies: Map<string, TruncationStrategy>;\n\n  constructor(config: ContextConfig) {\n    this.config = {\n      reservedTokens: 1000,\n      preserveSystemMessages: true,\n      preserveRecentCount: 1,\n      warningThreshold: 0.8,\n      truncationStrategy: 'oldest-first',\n      ...config,\n    };\n\n    this.counter = new TokenCounter();\n\n    // Initialize strategies\n    this.strategies = new Map<string, TruncationStrategy>();\n    this.strategies.set('oldest-first', new OldestFirstStrategy());\n    this.strategies.set('sliding-window', new SlidingWindowStrategy());\n    this.strategies.set('importance-based', new ImportanceBasedStrategy());\n    this.strategies.set('least-relevant', new LeastRelevantStrategy());\n  }\n\n  /**\n   * Get current token usage\n   */\n  getTokenUsage(messages: ContextMessage[]): TokenUsage {\n    const messageTokens = this.counter.countMessagesTokens(messages, this.config.model);\n    const reservedTokens = this.config.reservedTokens ?? 1000;\n    const maxTokens = this.config.maxTokens;\n\n    return {\n      totalTokens: messageTokens,\n      messageTokens: messageTokens,\n      overheadTokens: 3, // base overhead\n      remainingTokens: Math.max(0, maxTokens - messageTokens - reservedTokens),\n    };\n  }\n\n  /**\n   * Check if messages need truncation\n   */\n  needsTruncation(messages: ContextMessage[]): boolean {\n    const usage = this.getTokenUsage(messages);\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    return usage.totalTokens > maxTokens;\n  }\n\n  /**\n   * Check if approaching token limit\n   */\n  isApproachingLimit(messages: ContextMessage[]): boolean {\n    const usage = this.getTokenUsage(messages);\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    const threshold = this.config.warningThreshold ?? 0.8;\n    return usage.totalTokens >= maxTokens * threshold;\n  }\n\n  /**\n   * Truncate messages using configured strategy\n   */\n  truncate(messages: ContextMessage[]): ContextMessage[] {\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    const currentTokens = this.counter.countMessagesTokens(messages, this.config.model);\n\n    // Check if truncation is needed\n    if (currentTokens <= maxTokens) {\n      return messages;\n    }\n\n    // Get strategy\n    let strategy: TruncationStrategy;\n\n    if (this.config.truncationStrategy === 'custom' && this.config.customTruncationFn) {\n      // Use custom function\n      const result = this.config.customTruncationFn(messages, maxTokens);\n      if (this.config.onTruncate) {\n        const removed = messages.filter((m) => !result.includes(m));\n        this.config.onTruncate(removed, result);\n      }\n      return result;\n    } else {\n      strategy = this.strategies.get(this.config.truncationStrategy ?? 'oldest-first')!;\n    }\n\n    // Execute truncation\n    const result = strategy.truncate(messages, maxTokens, currentTokens, this.config);\n\n    // Callback\n    if (this.config.onTruncate) {\n      const removed = messages.filter((m) => !result.includes(m));\n      this.config.onTruncate(removed, result);\n    }\n\n    return result;\n  }\n\n  /**\n   * Add message with automatic truncation\n   */\n  addMessage(\n    messages: ContextMessage[],\n    newMessage: ContextMessage\n  ): ContextMessage[] {\n    const updatedMessages = [...messages, newMessage];\n\n    // Check for warning threshold\n    if (this.isApproachingLimit(updatedMessages) && this.config.onWarning) {\n      const usage = this.getTokenUsage(updatedMessages);\n      this.config.onWarning(usage);\n    }\n\n    // Truncate if needed\n    if (this.needsTruncation(updatedMessages)) {\n      return this.truncate(updatedMessages);\n    }\n\n    return updatedMessages;\n  }\n\n  /**\n   * Add multiple messages with automatic truncation\n   */\n  addMessages(\n    messages: ContextMessage[],\n    newMessages: ContextMessage[]\n  ): ContextMessage[] {\n    let result = messages;\n\n    for (const message of newMessages) {\n      result = this.addMessage(result, message);\n    }\n\n    return result;\n  }\n\n  /**\n   * Get maximum token limit for current model\n   */\n  getModelMaxTokens(): number {\n    return MODEL_TOKEN_LIMITS[this.config.model] ?? 8192;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<ContextConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n\n  /**\n   * Register a custom truncation strategy\n   */\n  registerStrategy(strategy: TruncationStrategy): void {\n    this.strategies.set(strategy.name, strategy);\n  }\n\n  /**\n   * Clean up resources\n   */\n  dispose(): void {\n    this.counter.dispose();\n  }\n}\n","/**\n * LLM Provider Interface\n *\n * Defines the contract for LLM providers to integrate with the agent system\n */\n\nimport { Message, ToolCall } from '../types';\n\n/**\n * Chat request parameters\n */\nexport interface ChatRequest {\n  messages: Message[];\n  tools?: Array<{\n    name: string;\n    description: string;\n    parameters: Record<string, unknown>;\n  }>;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n  streaming?: boolean;\n  onStream?: (chunk: string) => void | Promise<void>;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n  content: string;\n  toolCalls?: ToolCall[];\n  finishReason?: 'stop' | 'tool_calls' | 'length' | 'content_filter';\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n}\n\n/**\n * Base LLM provider interface\n */\nexport abstract class LLMProvider {\n  protected config: any;\n\n  constructor(config: any) {\n    this.config = config;\n  }\n\n  /**\n   * Send a chat request to the LLM\n   */\n  abstract chat(request: ChatRequest): Promise<ChatResponse>;\n\n  /**\n   * Get provider name\n   */\n  abstract getProviderName(): string;\n}\n","/**\n * AIKIT Agent Orchestration System - Type Definitions\n *\n * This module defines the core types for the AI agent execution framework.\n * Provides type-safe interfaces for agents, tools, and execution traces.\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Tool Definition Types\n// ============================================================================\n\n/**\n * Schema definition for tool parameters using Zod\n */\nexport type ToolParameterSchema = z.ZodObject<any> | z.ZodType<any>;\n\n/**\n * Tool metadata and configuration\n */\nexport interface ToolDefinition<TParams = any, TResult = any> {\n  /**\n   * Unique identifier for the tool\n   */\n  name: string;\n\n  /**\n   * Human-readable description of what the tool does\n   * This is used by the LLM to understand when to use the tool\n   */\n  description: string;\n\n  /**\n   * Zod schema for validating tool parameters\n   */\n  parameters: ToolParameterSchema;\n\n  /**\n   * The actual function that executes the tool\n   * @param params - Validated parameters matching the schema\n   * @returns Promise resolving to the tool result\n   */\n  execute: (params: TParams) => Promise<TResult>;\n\n  /**\n   * Optional retry configuration\n   */\n  retry?: {\n    maxAttempts: number;\n    backoffMs: number;\n  };\n\n  /**\n   * Optional timeout in milliseconds\n   */\n  timeoutMs?: number;\n\n  /**\n   * Optional metadata for categorization and filtering\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Runtime tool call request from the LLM\n */\nexport interface ToolCall {\n  /**\n   * Unique ID for this specific tool call invocation\n   */\n  id: string;\n\n  /**\n   * Name of the tool to execute\n   */\n  name: string;\n\n  /**\n   * Parameters to pass to the tool (validated against schema)\n   */\n  parameters: Record<string, unknown>;\n}\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n  /**\n   * ID of the tool call this result corresponds to\n   */\n  toolCallId: string;\n\n  /**\n   * Name of the tool that was executed\n   */\n  toolName: string;\n\n  /**\n   * The result data from the tool execution\n   */\n  result: unknown;\n\n  /**\n   * Error information if the tool execution failed\n   */\n  error?: {\n    message: string;\n    code?: string;\n    stack?: string;\n  };\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    durationMs: number;\n    timestamp: string;\n    retryCount?: number;\n  };\n}\n\n// ============================================================================\n// Agent Types\n// ============================================================================\n\n/**\n * Agent configuration\n */\nexport interface AgentConfig {\n  /**\n   * Unique identifier for the agent\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the agent's purpose and capabilities\n   */\n  description?: string;\n\n  /**\n   * System prompt that defines the agent's behavior\n   */\n  systemPrompt: string;\n\n  /**\n   * LLM provider configuration\n   */\n  llm: {\n    provider: 'openai' | 'anthropic' | 'google' | 'custom';\n    model: string;\n    temperature?: number;\n    maxTokens?: number;\n    topP?: number;\n    apiKey?: string;\n    baseUrl?: string;\n  };\n\n  /**\n   * Tools available to this agent\n   */\n  tools: ToolDefinition[];\n\n  /**\n   * Maximum number of execution steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Whether to enable streaming responses\n   */\n  streaming?: boolean;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Message in the agent conversation\n */\nexport interface Message {\n  role: 'system' | 'user' | 'assistant' | 'tool';\n  content: string;\n  name?: string; // For tool messages\n  toolCalls?: ToolCall[];\n  toolCallId?: string; // For tool result messages\n  timestamp?: string;\n}\n\n/**\n * Agent state during execution\n */\nexport interface AgentState {\n  /**\n   * Current step number in the execution\n   */\n  step: number;\n\n  /**\n   * Conversation history\n   */\n  messages: Message[];\n\n  /**\n   * Pending tool calls waiting to be executed\n   */\n  pendingToolCalls: ToolCall[];\n\n  /**\n   * Results from completed tool calls\n   */\n  toolResults: ToolResult[];\n\n  /**\n   * Whether the agent has finished execution\n   */\n  isComplete: boolean;\n\n  /**\n   * Final response if execution is complete\n   */\n  finalResponse?: string;\n\n  /**\n   * Error information if execution failed\n   */\n  error?: {\n    message: string;\n    step: number;\n    cause?: unknown;\n  };\n}\n\n// ============================================================================\n// Execution Trace Types\n// ============================================================================\n\n/**\n * Types of events in the execution trace\n */\nexport type TraceEventType =\n  | 'agent_start'\n  | 'agent_end'\n  | 'llm_request'\n  | 'llm_response'\n  | 'llm_stream_start'\n  | 'llm_stream_chunk'\n  | 'llm_stream_end'\n  | 'tool_call_request'\n  | 'tool_call_start'\n  | 'tool_call_end'\n  | 'tool_call_error'\n  | 'step_start'\n  | 'step_end'\n  | 'error';\n\n/**\n * Individual trace event\n */\nexport interface TraceEvent {\n  /**\n   * Event type\n   */\n  type: TraceEventType;\n\n  /**\n   * Timestamp when the event occurred\n   */\n  timestamp: string;\n\n  /**\n   * Step number during which this event occurred\n   */\n  step?: number;\n\n  /**\n   * Event-specific data\n   */\n  data: Record<string, unknown>;\n\n  /**\n   * Duration in milliseconds (for start/end pairs)\n   */\n  durationMs?: number;\n}\n\n/**\n * Complete execution trace\n */\nexport interface ExecutionTrace {\n  /**\n   * Unique execution ID\n   */\n  executionId: string;\n\n  /**\n   * Agent ID\n   */\n  agentId: string;\n\n  /**\n   * Start timestamp\n   */\n  startTime: string;\n\n  /**\n   * End timestamp\n   */\n  endTime?: string;\n\n  /**\n   * Total duration in milliseconds\n   */\n  durationMs?: number;\n\n  /**\n   * All trace events in chronological order\n   */\n  events: TraceEvent[];\n\n  /**\n   * Final agent state\n   */\n  finalState?: AgentState;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSteps: number;\n    totalToolCalls: number;\n    totalLLMCalls: number;\n    totalTokensUsed?: number;\n    successfulToolCalls: number;\n    failedToolCalls: number;\n  };\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\n/**\n * Streaming event types\n */\nexport type StreamEventType =\n  | 'start'\n  | 'step'\n  | 'thought'\n  | 'tool_call'\n  | 'tool_result'\n  | 'text_chunk'\n  | 'final_answer'\n  | 'complete'\n  | 'error';\n\n/**\n * Base streaming event\n */\nexport interface StreamEvent {\n  type: StreamEventType;\n  timestamp: string;\n  data: unknown;\n}\n\n/**\n * Streaming callback handler\n */\nexport type StreamCallback = (event: StreamEvent) => void | Promise<void>;\n\n/**\n * Agent step event for streaming\n */\nexport interface AgentStepEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'step';\n\n  /**\n   * Current step number\n   */\n  step: number;\n\n  /**\n   * Step timestamp\n   */\n  timestamp: string;\n\n  /**\n   * Step metadata\n   */\n  metadata?: {\n    messagesCount?: number;\n    pendingToolCalls?: number;\n  };\n}\n\n/**\n * Thought event - agent's reasoning/thinking\n */\nexport interface ThoughtEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'thought';\n\n  /**\n   * The thought/reasoning content\n   */\n  content: string;\n\n  /**\n   * Step number during which this thought occurred\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool call event\n */\nexport interface ToolCallEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_call';\n\n  /**\n   * The tool call details\n   */\n  toolCall: ToolCall;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool result event\n */\nexport interface ToolResultEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_result';\n\n  /**\n   * The tool execution result\n   */\n  result: ToolResult;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Final answer event\n */\nexport interface FinalAnswerEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'final_answer';\n\n  /**\n   * The final answer/response\n   */\n  answer: string;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'error';\n\n  /**\n   * Error message\n   */\n  error: string;\n\n  /**\n   * Error code\n   */\n  code?: string;\n\n  /**\n   * Step number where error occurred\n   */\n  step?: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Union type of all agent execution streaming events\n */\nexport type AgentExecutionEvent =\n  | AgentStepEvent\n  | ThoughtEvent\n  | ToolCallEvent\n  | ToolResultEvent\n  | FinalAnswerEvent\n  | ErrorEvent;\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error for agent system\n */\nexport class AgentError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public context?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'AgentError';\n  }\n}\n\n/**\n * Tool execution error\n */\nexport class ToolExecutionError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public toolCallId: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_EXECUTION_ERROR', { ...context, toolName, toolCallId });\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * Tool validation error\n */\nexport class ToolValidationError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public validationErrors: z.ZodError,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_VALIDATION_ERROR', {\n      ...context,\n      toolName,\n      errors: validationErrors.errors,\n    });\n    this.name = 'ToolValidationError';\n  }\n}\n\n/**\n * LLM error\n */\nexport class LLMError extends AgentError {\n  constructor(\n    message: string,\n    public provider: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'LLM_ERROR', { ...context, provider });\n    this.name = 'LLMError';\n  }\n}\n\n/**\n * Max steps exceeded error\n */\nexport class MaxStepsExceededError extends AgentError {\n  constructor(maxSteps: number, context?: Record<string, unknown>) {\n    super(\n      `Agent exceeded maximum steps: ${maxSteps}`,\n      'MAX_STEPS_EXCEEDED',\n      { ...context, maxSteps }\n    );\n    this.name = 'MaxStepsExceededError';\n  }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Extract parameter type from tool definition\n */\nexport type ToolParams<T extends ToolDefinition> = T extends ToolDefinition<\n  infer P,\n  any\n>\n  ? P\n  : never;\n\n/**\n * Extract result type from tool definition\n */\nexport type ToolResultType<T extends ToolDefinition> = T extends ToolDefinition<\n  any,\n  infer R\n>\n  ? R\n  : never;\n\n/**\n * Type-safe tool registry\n */\nexport type ToolRegistry = Map<string, ToolDefinition>;\n\n// ============================================================================\n// Agent Swarm Types\n// ============================================================================\n\n/**\n * Role of an agent in the swarm\n */\nexport type AgentRole = 'supervisor' | 'specialist';\n\n/**\n * Specialist agent configuration for swarm\n */\nexport interface SpecialistAgent {\n  /**\n   * Unique identifier for the specialist\n   */\n  id: string;\n\n  /**\n   * Agent instance\n   */\n  agent: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialization area/domain\n   */\n  specialization: string;\n\n  /**\n   * Keywords/tags that trigger this specialist\n   */\n  keywords?: string[];\n\n  /**\n   * Priority when multiple specialists match (higher = preferred)\n   */\n  priority?: number;\n\n  /**\n   * Whether this specialist can handle multiple tasks concurrently\n   */\n  concurrent?: boolean;\n}\n\n/**\n * Task routing decision\n */\nexport interface TaskRoutingDecision {\n  /**\n   * ID of the specialist agent to handle the task\n   */\n  specialistId: string;\n\n  /**\n   * Reason for routing to this specialist\n   */\n  reason: string;\n\n  /**\n   * Confidence score (0-1)\n   */\n  confidence: number;\n}\n\n/**\n * Specialist execution result\n */\nexport interface SpecialistResult {\n  /**\n   * ID of the specialist that executed the task\n   */\n  specialistId: string;\n\n  /**\n   * Specialization area\n   */\n  specialization: string;\n\n  /**\n   * Response from the specialist\n   */\n  response: string;\n\n  /**\n   * Execution trace from the specialist\n   */\n  trace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    startTime: string;\n    endTime: string;\n    durationMs: number;\n  };\n}\n\n/**\n * Configuration for AgentSwarm\n */\nexport interface SwarmConfig {\n  /**\n   * Unique identifier for the swarm\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the swarm's purpose\n   */\n  description?: string;\n\n  /**\n   * Supervisor agent that coordinates specialists\n   */\n  supervisor: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialist agents in the swarm\n   */\n  specialists: SpecialistAgent[];\n\n  /**\n   * Maximum number of concurrent specialist executions\n   */\n  maxConcurrent?: number;\n\n  /**\n   * Whether to enable parallel execution of independent tasks\n   */\n  parallelExecution?: boolean;\n\n  /**\n   * Timeout for specialist executions (milliseconds)\n   */\n  specialistTimeoutMs?: number;\n\n  /**\n   * Custom routing strategy\n   */\n  customRouter?: (\n    task: string,\n    specialists: SpecialistAgent[]\n  ) => Promise<TaskRoutingDecision>;\n\n  /**\n   * Custom result synthesizer\n   */\n  customSynthesizer?: (\n    results: SpecialistResult[]\n  ) => Promise<string>;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Swarm execution result\n */\nexport interface SwarmResult {\n  /**\n   * Final synthesized response\n   */\n  response: string;\n\n  /**\n   * Results from individual specialists\n   */\n  specialistResults: SpecialistResult[];\n\n  /**\n   * Combined execution trace from all agents\n   */\n  combinedTrace: ExecutionTrace;\n\n  /**\n   * Supervisor's decision-making trace\n   */\n  supervisorTrace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSpecialistsInvoked: number;\n    successfulSpecialists: number;\n    failedSpecialists: number;\n    totalDurationMs: number;\n    parallelExecutions: number;\n  };\n}\n","/**\n * ID generation utilities\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n  const timestamp = Date.now().toString(36);\n  const randomPart = Math.random().toString(36).substring(2, 9);\n  const id = `${timestamp}-${randomPart}`;\n  return prefix ? `${prefix}-${id}` : id;\n}\n\n/**\n * Generate a short unique ID\n */\nexport function generateShortId(): string {\n  return Math.random().toString(36).substring(2, 9);\n}\n","/**\n * OpenAI LLM Provider\n *\n * Integration with OpenAI's chat completion API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\nimport { generateShortId } from '../../utils/id';\n\n/**\n * OpenAI-specific configuration\n */\nexport interface OpenAIConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  organization?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: OpenAIConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['OPENAI_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('OpenAI API key is required', 'openai', { config });\n    }\n  }\n\n  /**\n   * Send chat request to OpenAI\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const messages = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        max_tokens: request.maxTokens ?? this.config.maxTokens,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n        payload.tool_choice = 'auto';\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/chat/completions`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.apiKey}`,\n          ...(this.config.organization && {\n            'OpenAI-Organization': this.config.organization,\n          }),\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'OpenAI API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `OpenAI chat failed: ${errorObj.message}`,\n        'openai',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${this.apiKey}`,\n        ...(this.config.organization && {\n          'OpenAI-Organization': this.config.organization,\n        }),\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'OpenAI API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n            if (data === '[DONE]') continue;\n\n            try {\n              const parsed = JSON.parse(data);\n              const delta = parsed.choices?.[0]?.delta;\n\n              if (delta?.content) {\n                content += delta.content;\n                await onStream(delta.content);\n              }\n\n              if (delta?.tool_calls) {\n                toolCalls = this.parseToolCalls(delta.tool_calls);\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse OpenAI response\n   */\n  private parseResponse(data: any): ChatResponse {\n    const choice = data.choices?.[0];\n    if (!choice) {\n      throw new Error('No choices in OpenAI response');\n    }\n\n    const message = choice.message;\n    const toolCalls = message.tool_calls\n      ? this.parseToolCalls(message.tool_calls)\n      : undefined;\n\n    return {\n      content: message.content || '',\n      toolCalls,\n      finishReason: this.mapFinishReason(choice.finish_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.prompt_tokens,\n            completionTokens: data.usage.completion_tokens,\n            totalTokens: data.usage.total_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to OpenAI format\n   */\n  private convertMessages(messages: any[]): any[] {\n    return messages.map((msg) => {\n      const converted: any = {\n        role: msg.role,\n        content: msg.content,\n      };\n\n      if (msg.name) {\n        converted.name = msg.name;\n      }\n\n      if (msg.toolCalls) {\n        converted.tool_calls = msg.toolCalls.map((tc: ToolCall) => ({\n          id: tc.id,\n          type: 'function',\n          function: {\n            name: tc.name,\n            arguments: JSON.stringify(tc.parameters),\n          },\n        }));\n      }\n\n      if (msg.toolCallId) {\n        converted.tool_call_id = msg.toolCallId;\n      }\n\n      return converted;\n    });\n  }\n\n  /**\n   * Convert tools to OpenAI format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      type: 'function',\n      function: {\n        name: tool.name,\n        description: tool.description,\n        parameters: tool.parameters,\n      },\n    }));\n  }\n\n  /**\n   * Parse tool calls from OpenAI response\n   */\n  private parseToolCalls(toolCalls: any[]): ToolCall[] {\n    return toolCalls.map((tc) => ({\n      id: tc.id || `tool-${generateShortId()}`,\n      name: tc.function.name,\n      parameters: JSON.parse(tc.function.arguments || '{}'),\n    }));\n  }\n\n  /**\n   * Map OpenAI finish reason to standard format\n   */\n  private mapFinishReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'stop':\n        return 'stop';\n      case 'tool_calls':\n        return 'tool_calls';\n      case 'length':\n        return 'length';\n      case 'content_filter':\n        return 'content_filter';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'openai';\n  }\n}\n","/**\n * Anthropic LLM Provider\n *\n * Integration with Anthropic's Claude API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\n// import { generateShortId } from '../../utils/id';\n\n/**\n * Anthropic-specific configuration\n */\nexport interface AnthropicConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * Anthropic provider implementation\n */\nexport class AnthropicProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: AnthropicConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['ANTHROPIC_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('Anthropic API key is required', 'anthropic', { config });\n    }\n  }\n\n  /**\n   * Send chat request to Anthropic\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const { system, messages } = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        max_tokens: request.maxTokens ?? this.config.maxTokens ?? 4096,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (system) {\n        payload.system = system;\n      }\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/messages`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-api-key': this.apiKey,\n          'anthropic-version': '2023-06-01',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'Anthropic API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `Anthropic chat failed: ${errorObj.message}`,\n        'anthropic',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/messages`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'x-api-key': this.apiKey,\n        'anthropic-version': '2023-06-01',\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'Anthropic API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n\n            try {\n              const parsed = JSON.parse(data);\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'text_delta' && delta.text) {\n                  content += delta.text;\n                  await onStream(delta.text);\n                }\n              }\n\n              if (parsed.type === 'content_block_start') {\n                const block = parsed.content_block;\n                if (block.type === 'tool_use') {\n                  if (!toolCalls) toolCalls = [];\n                  toolCalls.push({\n                    id: block.id,\n                    name: block.name,\n                    parameters: {},\n                  });\n                }\n              }\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'input_json_delta' && delta.partial_json) {\n                  // Accumulate tool parameters\n                  if (toolCalls && toolCalls.length > 0) {\n                    const lastTool = toolCalls[toolCalls.length - 1];\n                    // Note: This is simplified - real implementation would\n                    // need to properly accumulate JSON chunks\n                    if (lastTool) {\n                      try {\n                        lastTool.parameters = JSON.parse(delta.partial_json);\n                      } catch {\n                        // Continue accumulating\n                      }\n                    }\n                  }\n                }\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse Anthropic response\n   */\n  private parseResponse(data: any): ChatResponse {\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    // Anthropic returns content as an array of blocks\n    if (data.content && Array.isArray(data.content)) {\n      for (const block of data.content) {\n        if (block.type === 'text') {\n          content += block.text;\n        } else if (block.type === 'tool_use') {\n          if (!toolCalls) toolCalls = [];\n          toolCalls.push({\n            id: block.id,\n            name: block.name,\n            parameters: block.input || {},\n          });\n        }\n      }\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: this.mapStopReason(data.stop_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.input_tokens,\n            completionTokens: data.usage.output_tokens,\n            totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to Anthropic format\n   */\n  private convertMessages(messages: any[]): {\n    system?: string;\n    messages: any[];\n  } {\n    let system: string | undefined;\n    const anthropicMessages: any[] = [];\n\n    for (const msg of messages) {\n      if (msg.role === 'system') {\n        system = msg.content;\n        continue;\n      }\n\n      if (msg.role === 'tool') {\n        // Tool result message\n        anthropicMessages.push({\n          role: 'user',\n          content: [\n            {\n              type: 'tool_result',\n              tool_use_id: msg.toolCallId,\n              content: msg.content,\n            },\n          ],\n        });\n      } else if (msg.toolCalls) {\n        // Assistant message with tool calls\n        const content: any[] = [];\n\n        if (msg.content) {\n          content.push({\n            type: 'text',\n            text: msg.content,\n          });\n        }\n\n        for (const tc of msg.toolCalls) {\n          content.push({\n            type: 'tool_use',\n            id: tc.id,\n            name: tc.name,\n            input: tc.parameters,\n          });\n        }\n\n        anthropicMessages.push({\n          role: 'assistant',\n          content,\n        });\n      } else {\n        // Regular message\n        anthropicMessages.push({\n          role: msg.role === 'user' ? 'user' : 'assistant',\n          content: msg.content,\n        });\n      }\n    }\n\n    return { system, messages: anthropicMessages };\n  }\n\n  /**\n   * Convert tools to Anthropic format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      input_schema: tool.parameters,\n    }));\n  }\n\n  /**\n   * Map Anthropic stop reason to standard format\n   */\n  private mapStopReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'end_turn':\n        return 'stop';\n      case 'tool_use':\n        return 'tool_calls';\n      case 'max_tokens':\n        return 'length';\n      case 'stop_sequence':\n        return 'stop';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'anthropic';\n  }\n}\n","/**\n * Type definitions for conversation summarization\n */\n\nimport { Message } from '../types';\n\n/**\n * Compression level for summaries\n */\nexport enum CompressionLevel {\n  /** Very brief summary - key points only */\n  BRIEF = 'brief',\n  /** Moderate summary - balanced detail */\n  MODERATE = 'moderate',\n  /** Detailed summary - comprehensive */\n  DETAILED = 'detailed',\n}\n\n/**\n * Summarization strategy\n */\nexport type SummaryStrategy =\n  | 'single-pass'\n  | 'rolling'\n  | 'hierarchical'\n  | 'extractive'\n  | 'hybrid';\n\n/**\n * LLM provider for summarization\n */\nexport type SummaryProvider = 'openai' | 'anthropic';\n\n/**\n * Configuration for conversation summarization\n */\nexport interface SummaryConfig {\n  /**\n   * Summarization strategy to use\n   */\n  strategy: SummaryStrategy;\n\n  /**\n   * Compression level\n   */\n  compressionLevel: CompressionLevel;\n\n  /**\n   * LLM provider for summarization\n   */\n  provider: SummaryProvider;\n\n  /**\n   * Provider-specific configuration\n   */\n  providerConfig: {\n    apiKey: string;\n    model: string;\n    temperature?: number;\n    maxTokens?: number;\n  };\n\n  /**\n   * Custom prompt template for summarization\n   */\n  customPrompt?: string;\n\n  /**\n   * Chunk size for rolling and hierarchical strategies (number of messages)\n   */\n  chunkSize?: number;\n\n  /**\n   * Maximum number of key points to extract\n   */\n  maxKeyPoints?: number;\n\n  /**\n   * Whether to cache summaries\n   */\n  enableCache?: boolean;\n\n  /**\n   * Cache TTL in seconds (0 = no expiration)\n   */\n  cacheTTL?: number;\n\n  /**\n   * Whether to include metadata in summaries\n   */\n  includeMetadata?: boolean;\n\n  /**\n   * Custom metadata to include in summary\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Summary of a conversation or conversation chunk\n */\nexport interface Summary {\n  /**\n   * Unique identifier for this summary\n   */\n  id: string;\n\n  /**\n   * Conversation ID this summary belongs to\n   */\n  conversationId: string;\n\n  /**\n   * The summarized content\n   */\n  content: string;\n\n  /**\n   * Key points extracted from the conversation\n   */\n  keyPoints?: string[];\n\n  /**\n   * Strategy used to generate this summary\n   */\n  strategy: SummaryStrategy;\n\n  /**\n   * Compression level used\n   */\n  compressionLevel: CompressionLevel;\n\n  /**\n   * Number of messages summarized\n   */\n  messageCount: number;\n\n  /**\n   * Range of messages summarized (indices)\n   */\n  messageRange?: {\n    start: number;\n    end: number;\n  };\n\n  /**\n   * Timestamp when summary was created\n   */\n  createdAt: number;\n\n  /**\n   * Timestamp when summary was last updated\n   */\n  updatedAt?: number;\n\n  /**\n   * Token usage for generating this summary\n   */\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n\n  /**\n   * Parent summary ID (for hierarchical summaries)\n   */\n  parentSummaryId?: string;\n\n  /**\n   * Child summary IDs (for hierarchical summaries)\n   */\n  childSummaryIds?: string[];\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Result of a summarization operation\n */\nexport interface SummarizationResult {\n  /**\n   * The primary summary\n   */\n  summary: Summary;\n\n  /**\n   * Additional summaries (for hierarchical strategy)\n   */\n  additionalSummaries?: Summary[];\n\n  /**\n   * Whether the summary was retrieved from cache\n   */\n  cached: boolean;\n\n  /**\n   * Total time taken to generate summary (ms)\n   */\n  durationMs: number;\n}\n\n/**\n * Options for summarization\n */\nexport interface SummarizeOptions {\n  /**\n   * Start index for messages to summarize\n   */\n  startIndex?: number;\n\n  /**\n   * End index for messages to summarize\n   */\n  endIndex?: number;\n\n  /**\n   * Whether to force regeneration (skip cache)\n   */\n  forceRegenerate?: boolean;\n\n  /**\n   * Additional context to include in summarization\n   */\n  context?: string;\n\n  /**\n   * Custom metadata for this summary\n   */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Cache entry for summaries\n */\nexport interface SummaryCacheEntry {\n  /**\n   * Cache key\n   */\n  key: string;\n\n  /**\n   * Cached summary\n   */\n  summary: Summary;\n\n  /**\n   * Timestamp when cached\n   */\n  cachedAt: number;\n\n  /**\n   * TTL in seconds\n   */\n  ttl: number;\n}\n\n/**\n * Statistics for summarization operations\n */\nexport interface SummarizationStats {\n  /**\n   * Total number of summaries generated\n   */\n  totalSummaries: number;\n\n  /**\n   * Number of cached summaries used\n   */\n  cacheHits: number;\n\n  /**\n   * Number of summaries regenerated\n   */\n  cacheMisses: number;\n\n  /**\n   * Total tokens used for summarization\n   */\n  totalTokens: number;\n\n  /**\n   * Average time per summary (ms)\n   */\n  averageDurationMs: number;\n\n  /**\n   * Total time spent on summarization (ms)\n   */\n  totalDurationMs: number;\n}\n\n/**\n * Extractive summary sentence\n */\nexport interface ExtractedSentence {\n  /**\n   * The extracted sentence\n   */\n  text: string;\n\n  /**\n   * Score/importance of this sentence\n   */\n  score: number;\n\n  /**\n   * Source message index\n   */\n  messageIndex: number;\n\n  /**\n   * Role of the message author\n   */\n  role: string;\n}\n\n/**\n * Options for incremental summarization\n */\nexport interface IncrementalSummaryOptions {\n  /**\n   * Existing summary to build upon\n   */\n  existingSummary: Summary;\n\n  /**\n   * New messages to incorporate\n   */\n  newMessages: Message[];\n\n  /**\n   * Whether to merge or append new content\n   */\n  mode: 'merge' | 'append';\n}\n","/**\n * Extractive summarization utilities\n *\n * Extract key sentences from conversations without using LLMs\n */\n\nimport { Message, MessageContent } from '../types';\nimport { ExtractedSentence } from './types';\n\n/**\n * Extract text content from a message\n */\nfunction getTextContent(content: string | MessageContent | MessageContent[]): string {\n  if (typeof content === 'string') {\n    return content;\n  }\n  if (Array.isArray(content)) {\n    return content\n      .filter((c): c is MessageContent & { type: 'text' } => c.type === 'text')\n      .map((c) => c.data)\n      .join(' ');\n  }\n  return content.type === 'text' ? content.data : '';\n}\n\n/**\n * Simple word tokenizer\n */\nfunction tokenize(text: string): string[] {\n  return text\n    .toLowerCase()\n    .replace(/[^\\w\\s]/g, ' ')\n    .split(/\\s+/)\n    .filter((word) => word.length > 0);\n}\n\n/**\n * Calculate term frequency for a document\n */\nfunction calculateTF(words: string[]): Map<string, number> {\n  const tf = new Map<string, number>();\n  const totalWords = words.length;\n\n  for (const word of words) {\n    tf.set(word, (tf.get(word) || 0) + 1 / totalWords);\n  }\n\n  return tf;\n}\n\n/**\n * Calculate inverse document frequency across all messages\n */\nfunction calculateIDF(messages: Message[]): Map<string, number> {\n  const idf = new Map<string, number>();\n  const totalDocs = messages.length;\n  const docFrequency = new Map<string, number>();\n\n  // Count document frequency\n  for (const message of messages) {\n    const words = new Set(tokenize(getTextContent(message.content)));\n    for (const word of words) {\n      docFrequency.set(word, (docFrequency.get(word) || 0) + 1);\n    }\n  }\n\n  // Calculate IDF\n  for (const [word, freq] of docFrequency) {\n    idf.set(word, Math.log(totalDocs / freq));\n  }\n\n  return idf;\n}\n\n/**\n * Calculate TF-IDF scores for sentences\n */\nfunction calculateTFIDF(\n  sentence: string,\n  tf: Map<string, number>,\n  idf: Map<string, number>\n): number {\n  const words = tokenize(sentence);\n  let score = 0;\n\n  for (const word of words) {\n    const tfScore = tf.get(word) || 0;\n    const idfScore = idf.get(word) || 0;\n    score += tfScore * idfScore;\n  }\n\n  return score / (words.length || 1);\n}\n\n/**\n * Split text into sentences\n */\nfunction splitIntoSentences(text: string): string[] {\n  // Simple sentence splitting - handles common cases\n  return text\n    .split(/[.!?]+/)\n    .map((s) => s.trim())\n    .filter((s) => s.length > 10); // Filter out very short fragments\n}\n\n/**\n * Extract key sentences from messages using TF-IDF\n */\nexport function extractKeySentences(\n  messages: Message[],\n  maxSentences: number = 5\n): ExtractedSentence[] {\n  if (messages.length === 0) {\n    return [];\n  }\n\n  // Calculate IDF across all messages\n  const idf = calculateIDF(messages);\n\n  const scoredSentences: ExtractedSentence[] = [];\n\n  // Process each message\n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i];\n    if (!message) continue; // Skip if message is undefined (shouldn't happen)\n\n    const sentences = splitIntoSentences(getTextContent(message.content));\n    const words = tokenize(getTextContent(message.content));\n    const tf = calculateTF(words);\n\n    for (const sentence of sentences) {\n      const score = calculateTFIDF(sentence, tf, idf);\n\n      // Boost score for user messages (often contain questions/requests)\n      const roleBoost = message.role === 'user' ? 1.2 : 1.0;\n\n      scoredSentences.push({\n        text: sentence,\n        score: score * roleBoost,\n        messageIndex: i,\n        role: message.role,\n      });\n    }\n  }\n\n  // Sort by score and return top N\n  return scoredSentences\n    .sort((a, b) => b.score - a.score)\n    .slice(0, maxSentences);\n}\n\n/**\n * Extract key points from messages (distinct from sentences)\n */\nexport function extractKeyPoints(\n  messages: Message[],\n  maxPoints: number = 5\n): string[] {\n  const sentences = extractKeySentences(messages, maxPoints * 2);\n\n  // Group consecutive sentences from same message\n  const points: string[] = [];\n  const seen = new Set<number>();\n\n  for (const sentence of sentences) {\n    if (points.length >= maxPoints) break;\n    if (seen.has(sentence.messageIndex)) continue;\n\n    points.push(sentence.text);\n    seen.add(sentence.messageIndex);\n  }\n\n  return points;\n}\n\n/**\n * Create an extractive summary from messages\n */\nexport function createExtractiveSummary(\n  messages: Message[],\n  maxSentences: number = 5\n): string {\n  const sentences = extractKeySentences(messages, maxSentences);\n\n  // Sort by message index to maintain chronological order\n  const orderedSentences = sentences.sort(\n    (a, b) => a.messageIndex - b.messageIndex\n  );\n\n  return orderedSentences.map((s) => s.text).join('. ') + '.';\n}\n\n/**\n * Calculate conversation diversity (vocabulary richness)\n */\nexport function calculateDiversity(messages: Message[]): number {\n  const allWords = messages.flatMap((m) => tokenize(getTextContent(m.content)));\n  const uniqueWords = new Set(allWords);\n\n  if (allWords.length === 0) return 0;\n\n  return uniqueWords.size / allWords.length;\n}\n\n/**\n * Identify important keywords in conversation\n */\nexport function extractKeywords(\n  messages: Message[],\n  topN: number = 10\n): string[] {\n  const idf = calculateIDF(messages);\n  const allWords = messages.flatMap((m) => tokenize(getTextContent(m.content)));\n  const tf = calculateTF(allWords);\n\n  // Calculate TF-IDF for each word\n  const wordScores = new Map<string, number>();\n  for (const [word, tfScore] of tf) {\n    const idfScore = idf.get(word) || 0;\n    wordScores.set(word, tfScore * idfScore);\n  }\n\n  // Filter out common stop words\n  const stopWords = new Set([\n    'the',\n    'a',\n    'an',\n    'and',\n    'or',\n    'but',\n    'in',\n    'on',\n    'at',\n    'to',\n    'for',\n    'of',\n    'with',\n    'by',\n    'from',\n    'as',\n    'is',\n    'was',\n    'are',\n    'were',\n    'be',\n    'been',\n    'being',\n    'have',\n    'has',\n    'had',\n    'do',\n    'does',\n    'did',\n    'will',\n    'would',\n    'should',\n    'could',\n    'can',\n    'may',\n    'might',\n    'must',\n    'this',\n    'that',\n    'these',\n    'those',\n    'i',\n    'you',\n    'he',\n    'she',\n    'it',\n    'we',\n    'they',\n    'what',\n    'which',\n    'who',\n    'when',\n    'where',\n    'why',\n    'how',\n  ]);\n\n  const filteredScores = Array.from(wordScores.entries()).filter(\n    ([word]) => !stopWords.has(word) && word.length > 2\n  );\n\n  return filteredScores\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, topN)\n    .map(([word]) => word);\n}\n","/**\n * Conversation Summarizer\n *\n * Automatic summarization of long conversations using various strategies\n */\n\nimport { Message } from '../types';\nimport { LLMProvider } from '../agents/llm/LLMProvider';\nimport { OpenAIProvider } from '../agents/llm/OpenAIProvider';\nimport { AnthropicProvider } from '../agents/llm/AnthropicProvider';\nimport { generateShortId } from '../utils/id';\nimport {\n  SummaryConfig,\n  Summary,\n  SummarizationResult,\n  SummarizeOptions,\n  CompressionLevel,\n  SummaryStrategy,\n  SummaryCacheEntry,\n  SummarizationStats,\n  IncrementalSummaryOptions,\n} from './types';\nimport {\n  extractKeySentences,\n  extractKeyPoints,\n  createExtractiveSummary,\n  extractKeywords,\n} from './extractive';\n\n/**\n * Default prompts for different compression levels\n */\nconst DEFAULT_PROMPTS = {\n  [CompressionLevel.BRIEF]:\n    'Provide a very brief 2-3 sentence summary of this conversation, focusing only on the most critical points.',\n  [CompressionLevel.MODERATE]:\n    'Summarize this conversation in a paragraph, covering the main topics and key decisions.',\n  [CompressionLevel.DETAILED]:\n    'Provide a comprehensive summary of this conversation, including all important topics, decisions, and context.',\n};\n\n/**\n * Conversation Summarizer\n */\nexport class ConversationSummarizer {\n  private config: SummaryConfig;\n  private provider: LLMProvider;\n  private cache: Map<string, SummaryCacheEntry>;\n  private stats: SummarizationStats;\n\n  constructor(config: SummaryConfig) {\n    this.config = {\n      chunkSize: 10,\n      maxKeyPoints: 5,\n      enableCache: true,\n      cacheTTL: 3600, // 1 hour default\n      includeMetadata: true,\n      ...config,\n    };\n\n    this.provider = this.createProvider();\n    this.cache = new Map();\n    this.stats = {\n      totalSummaries: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      totalTokens: 0,\n      averageDurationMs: 0,\n      totalDurationMs: 0,\n    };\n  }\n\n  /**\n   * Create LLM provider based on configuration\n   */\n  private createProvider(): LLMProvider {\n    const { provider, providerConfig } = this.config;\n\n    if (provider === 'openai') {\n      return new OpenAIProvider({\n        apiKey: providerConfig.apiKey,\n        model: providerConfig.model,\n        temperature: providerConfig.temperature ?? 0.3,\n        maxTokens: providerConfig.maxTokens ?? 1000,\n      });\n    } else if (provider === 'anthropic') {\n      return new AnthropicProvider({\n        apiKey: providerConfig.apiKey,\n        model: providerConfig.model,\n        temperature: providerConfig.temperature ?? 0.3,\n        maxTokens: providerConfig.maxTokens ?? 1000,\n      });\n    }\n\n    throw new Error(`Unsupported provider: ${provider}`);\n  }\n\n  /**\n   * Summarize a conversation\n   */\n  async summarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions = {}\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // Apply message range if specified\n    const startIdx = options.startIndex ?? 0;\n    const endIdx = options.endIndex ?? messages.length;\n    const messagesToSummarize = messages.slice(startIdx, endIdx);\n\n    if (messagesToSummarize.length === 0) {\n      throw new Error('No messages to summarize');\n    }\n\n    // Check cache if enabled\n    if (this.config.enableCache && !options.forceRegenerate) {\n      const cached = this.getCachedSummary(\n        conversationId,\n        startIdx,\n        endIdx,\n        this.config.strategy\n      );\n      if (cached) {\n        this.stats.cacheHits++;\n        return {\n          summary: cached,\n          cached: true,\n          durationMs: Date.now() - startTime,\n        };\n      }\n    }\n\n    this.stats.cacheMisses++;\n\n    // Generate summary based on strategy\n    let result: SummarizationResult;\n\n    switch (this.config.strategy) {\n      case 'single-pass':\n        result = await this.singlePassSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'rolling':\n        result = await this.rollingSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'hierarchical':\n        result = await this.hierarchicalSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'extractive':\n        result = await this.extractiveSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      case 'hybrid':\n        result = await this.hybridSummarize(\n          conversationId,\n          messagesToSummarize,\n          options\n        );\n        break;\n      default:\n        throw new Error(`Unsupported strategy: ${this.config.strategy}`);\n    }\n\n    // Update message range\n    result.summary.messageRange = { start: startIdx, end: endIdx };\n\n    // Cache the result\n    if (this.config.enableCache) {\n      this.cacheSummary(result.summary);\n    }\n\n    // Update stats\n    this.stats.totalSummaries++;\n    this.stats.totalDurationMs += result.durationMs;\n    this.stats.averageDurationMs =\n      this.stats.totalDurationMs / this.stats.totalSummaries;\n    if (result.summary.usage) {\n      this.stats.totalTokens += result.summary.usage.totalTokens;\n    }\n\n    return result;\n  }\n\n  /**\n   * Single-pass summarization - summarize entire conversation in one LLM call\n   */\n  private async singlePassSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    const prompt = this.buildPrompt(messages, options.context);\n    const response = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: prompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: response.content,\n      keyPoints: this.extractKeyPointsFromSummary(response.content),\n      strategy: 'single-pass',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: response.usage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Rolling summarization - summarize in chunks, then summarize summaries\n   */\n  private async rollingSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const chunkSize = this.config.chunkSize ?? 10;\n\n    // Split into chunks\n    const chunks: Message[][] = [];\n    for (let i = 0; i < messages.length; i += chunkSize) {\n      chunks.push(messages.slice(i, i + chunkSize));\n    }\n\n    // Summarize each chunk\n    const chunkSummaries: string[] = [];\n    let totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n    for (const chunk of chunks) {\n      const prompt = this.buildPrompt(chunk, options.context);\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: 'Summarize this portion of the conversation concisely.',\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens,\n      });\n\n      chunkSummaries.push(response.content);\n      if (response.usage) {\n        totalUsage.promptTokens += response.usage.promptTokens;\n        totalUsage.completionTokens += response.usage.completionTokens;\n        totalUsage.totalTokens += response.usage.totalTokens;\n      }\n    }\n\n    // Summarize the summaries\n    const finalPrompt = `Combine these summaries into a ${this.config.compressionLevel} summary:\\n\\n${chunkSummaries.join('\\n\\n')}`;\n    const finalResponse = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: finalPrompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    if (finalResponse.usage) {\n      totalUsage.promptTokens += finalResponse.usage.promptTokens;\n      totalUsage.completionTokens += finalResponse.usage.completionTokens;\n      totalUsage.totalTokens += finalResponse.usage.totalTokens;\n    }\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: finalResponse.content,\n      keyPoints: this.extractKeyPointsFromSummary(finalResponse.content),\n      strategy: 'rolling',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: totalUsage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Hierarchical summarization - create multi-level summaries\n   */\n  private async hierarchicalSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const chunkSize = this.config.chunkSize ?? 10;\n\n    // Create leaf-level summaries\n    const leafSummaries: Summary[] = [];\n    let totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n    for (let i = 0; i < messages.length; i += chunkSize) {\n      const chunk = messages.slice(i, i + chunkSize);\n      const prompt = this.buildPrompt(chunk, options.context);\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: 'Summarize this portion of the conversation.',\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens ?? 500,\n      });\n\n      if (response.usage) {\n        totalUsage.promptTokens += response.usage.promptTokens;\n        totalUsage.completionTokens += response.usage.completionTokens;\n        totalUsage.totalTokens += response.usage.totalTokens;\n      }\n\n      leafSummaries.push({\n        id: `sum-${generateShortId()}`,\n        conversationId,\n        content: response.content,\n        strategy: 'hierarchical',\n        compressionLevel: CompressionLevel.MODERATE,\n        messageCount: chunk.length,\n        messageRange: { start: i, end: i + chunk.length },\n        createdAt: Date.now(),\n        usage: response.usage,\n      });\n    }\n\n    // Create root summary from leaf summaries\n    const leafContents = leafSummaries.map((s) => s.content).join('\\n\\n');\n    const finalResponse = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: `Create a ${this.config.compressionLevel} summary from these section summaries:\\n\\n${leafContents}`,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    if (finalResponse.usage) {\n      totalUsage.promptTokens += finalResponse.usage.promptTokens;\n      totalUsage.completionTokens += finalResponse.usage.completionTokens;\n      totalUsage.totalTokens += finalResponse.usage.totalTokens;\n    }\n\n    const rootSummary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: finalResponse.content,\n      keyPoints: this.extractKeyPointsFromSummary(finalResponse.content),\n      strategy: 'hierarchical',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: totalUsage,\n      childSummaryIds: leafSummaries.map((s) => s.id),\n      metadata: options.metadata,\n    };\n\n    // Link parent to children\n    leafSummaries.forEach((leaf) => {\n      leaf.parentSummaryId = rootSummary.id;\n    });\n\n    return {\n      summary: rootSummary,\n      additionalSummaries: leafSummaries,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Extractive summarization - extract key sentences without LLM\n   */\n  private async extractiveSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // Determine number of sentences based on compression level\n    const sentenceCount = {\n      [CompressionLevel.BRIEF]: 3,\n      [CompressionLevel.MODERATE]: 5,\n      [CompressionLevel.DETAILED]: 10,\n    }[this.config.compressionLevel];\n\n    const content = createExtractiveSummary(messages, sentenceCount);\n    const keyPoints = extractKeyPoints(\n      messages,\n      this.config.maxKeyPoints ?? 5\n    );\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content,\n      keyPoints,\n      strategy: 'extractive',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Hybrid summarization - combine extractive and abstractive approaches\n   */\n  private async hybridSummarize(\n    conversationId: string,\n    messages: Message[],\n    options: SummarizeOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n\n    // First, extract key sentences\n    const keySentences = extractKeySentences(messages, 10);\n    const keywords = extractKeywords(messages, 15);\n\n    // Build context from extracted content\n    const extractedContext = keySentences.map((s) => s.text).join(' ');\n\n    // Use LLM to create coherent summary from extracted content\n    const prompt = `Based on these key points from a conversation:\\n\\n${extractedContext}\\n\\nKey topics: ${keywords.join(', ')}\\n\\nCreate a ${this.config.compressionLevel} coherent summary.`;\n\n    const response = await this.provider.chat({\n      messages: [\n        {\n          role: 'system',\n          content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n          timestamp: new Date().toISOString(),\n        },\n        {\n          role: 'user',\n          content: prompt,\n          timestamp: new Date().toISOString(),\n        },\n      ],\n      temperature: this.config.providerConfig.temperature,\n      maxTokens: this.config.providerConfig.maxTokens,\n    });\n\n    const summary: Summary = {\n      id: `sum-${generateShortId()}`,\n      conversationId,\n      content: response.content,\n      keyPoints: keywords.slice(0, this.config.maxKeyPoints ?? 5),\n      strategy: 'hybrid',\n      compressionLevel: this.config.compressionLevel,\n      messageCount: messages.length,\n      createdAt: Date.now(),\n      usage: response.usage,\n      metadata: options.metadata,\n    };\n\n    return {\n      summary,\n      cached: false,\n      durationMs: Date.now() - startTime,\n    };\n  }\n\n  /**\n   * Incremental summarization - append new messages to existing summary\n   */\n  async summarizeIncremental(\n    options: IncrementalSummaryOptions\n  ): Promise<SummarizationResult> {\n    const startTime = Date.now();\n    const { existingSummary, newMessages, mode } = options;\n\n    if (mode === 'append') {\n      // Simple append - add new summary to existing\n      const newSummaryResult = await this.summarize(\n        existingSummary.conversationId,\n        newMessages,\n        { forceRegenerate: true }\n      );\n\n      const combinedSummary: Summary = {\n        ...existingSummary,\n        id: `sum-${generateShortId()}`,\n        content: `${existingSummary.content}\\n\\n${newSummaryResult.summary.content}`,\n        messageCount:\n          existingSummary.messageCount + newMessages.length,\n        updatedAt: Date.now(),\n      };\n\n      return {\n        summary: combinedSummary,\n        cached: false,\n        durationMs: Date.now() - startTime,\n      };\n    } else {\n      // Merge mode - re-summarize with context\n      const prompt = `Previous summary: ${existingSummary.content}\\n\\nNew messages to incorporate:\\n${this.buildPrompt(newMessages)}\\n\\nUpdate the summary to include the new information.`;\n\n      const response = await this.provider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: this.config.customPrompt || DEFAULT_PROMPTS[this.config.compressionLevel],\n            timestamp: new Date().toISOString(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n            timestamp: new Date().toISOString(),\n          },\n        ],\n        temperature: this.config.providerConfig.temperature,\n        maxTokens: this.config.providerConfig.maxTokens,\n      });\n\n      const mergedSummary: Summary = {\n        ...existingSummary,\n        id: `sum-${generateShortId()}`,\n        content: response.content,\n        keyPoints: this.extractKeyPointsFromSummary(response.content),\n        messageCount:\n          existingSummary.messageCount + newMessages.length,\n        updatedAt: Date.now(),\n        usage: response.usage,\n      };\n\n      return {\n        summary: mergedSummary,\n        cached: false,\n        durationMs: Date.now() - startTime,\n      };\n    }\n  }\n\n  /**\n   * Build prompt from messages\n   */\n  private buildPrompt(messages: Message[], context?: string): string {\n    const conversationText = messages\n      .map((m) => `${m.role}: ${m.content}`)\n      .join('\\n\\n');\n\n    if (context) {\n      return `Context: ${context}\\n\\nConversation:\\n${conversationText}`;\n    }\n\n    return `Conversation:\\n${conversationText}`;\n  }\n\n  /**\n   * Extract key points from summary text\n   */\n  private extractKeyPointsFromSummary(summary: string): string[] {\n    // Simple extraction - look for bullet points or numbered lists\n    const bulletPoints = summary.match(/^[-•*]\\s+(.+)$/gm);\n    if (bulletPoints) {\n      return bulletPoints\n        .map((p) => p.replace(/^[-•*]\\s+/, '').trim())\n        .slice(0, this.config.maxKeyPoints ?? 5);\n    }\n\n    const numberedPoints = summary.match(/^\\d+\\.\\s+(.+)$/gm);\n    if (numberedPoints) {\n      return numberedPoints\n        .map((p) => p.replace(/^\\d+\\.\\s+/, '').trim())\n        .slice(0, this.config.maxKeyPoints ?? 5);\n    }\n\n    // Fallback - split by sentences and take first few\n    return summary\n      .split(/[.!?]+/)\n      .map((s) => s.trim())\n      .filter((s) => s.length > 10)\n      .slice(0, this.config.maxKeyPoints ?? 5);\n  }\n\n  /**\n   * Get cached summary if available and not expired\n   */\n  private getCachedSummary(\n    conversationId: string,\n    startIdx: number,\n    endIdx: number,\n    strategy: SummaryStrategy\n  ): Summary | null {\n    const key = this.getCacheKey(conversationId, startIdx, endIdx, strategy);\n    const entry = this.cache.get(key);\n\n    if (!entry) return null;\n\n    // Check if expired\n    const now = Date.now();\n    const age = (now - entry.cachedAt) / 1000; // seconds\n    if (entry.ttl > 0 && age > entry.ttl) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return entry.summary;\n  }\n\n  /**\n   * Cache a summary\n   */\n  private cacheSummary(summary: Summary): void {\n    if (!summary.messageRange) return;\n\n    const key = this.getCacheKey(\n      summary.conversationId,\n      summary.messageRange.start,\n      summary.messageRange.end,\n      summary.strategy\n    );\n\n    this.cache.set(key, {\n      key,\n      summary,\n      cachedAt: Date.now(),\n      ttl: this.config.cacheTTL ?? 3600,\n    });\n  }\n\n  /**\n   * Generate cache key\n   */\n  private getCacheKey(\n    conversationId: string,\n    startIdx: number,\n    endIdx: number,\n    strategy: SummaryStrategy\n  ): string {\n    return `${conversationId}:${startIdx}:${endIdx}:${strategy}:${this.config.compressionLevel}`;\n  }\n\n  /**\n   * Clear cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get summarization statistics\n   */\n  getStats(): SummarizationStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Reset statistics\n   */\n  resetStats(): void {\n    this.stats = {\n      totalSummaries: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      totalTokens: 0,\n      averageDurationMs: 0,\n      totalDurationMs: 0,\n    };\n  }\n}\n","/**\n * Type definitions for session management\n */\n\n/**\n * Session data stored for each session\n */\nexport interface SessionData {\n  /** User ID associated with the session */\n  userId: string\n  /** Custom session data */\n  data: Record<string, any>\n  /** Timestamp when session was created (milliseconds) */\n  createdAt: number\n  /** Timestamp when session was last accessed (milliseconds) */\n  lastAccessedAt: number\n  /** Timestamp when session expires (milliseconds) */\n  expiresAt: number\n  /** IP address of the session (optional) */\n  ipAddress?: string\n  /** User agent string (optional) */\n  userAgent?: string\n  /** Session metadata */\n  metadata?: Record<string, any>\n}\n\n/**\n * Session object returned to consumers\n */\nexport interface Session {\n  /** Unique session identifier */\n  sessionId: string\n  /** User ID associated with the session */\n  userId: string\n  /** Custom session data */\n  data: Record<string, any>\n  /** Timestamp when session was created (milliseconds) */\n  createdAt: number\n  /** Timestamp when session was last accessed (milliseconds) */\n  lastAccessedAt: number\n  /** Timestamp when session expires (milliseconds) */\n  expiresAt: number\n  /** Whether the session is expired */\n  isExpired: boolean\n  /** IP address of the session (optional) */\n  ipAddress?: string\n  /** User agent string (optional) */\n  userAgent?: string\n  /** Session metadata */\n  metadata?: Record<string, any>\n}\n\n/**\n * Expiration strategy for sessions\n */\nexport enum ExpirationStrategy {\n  /** Session expires after a fixed time from creation */\n  FIXED = 'fixed',\n  /** Session expiration extends on each access (sliding window) */\n  SLIDING = 'sliding',\n  /** Session uses both fixed and sliding expiration */\n  HYBRID = 'hybrid'\n}\n\n/**\n * Storage backend type for sessions\n */\nexport enum StorageBackend {\n  /** In-memory storage (not persistent) */\n  MEMORY = 'memory',\n  /** Redis storage (persistent, distributed) */\n  REDIS = 'redis',\n  /** ZeroDB storage (persistent, encrypted) */\n  ZERODB = 'zerodb'\n}\n\n/**\n * Base configuration for session manager\n */\nexport interface BaseSessionConfig {\n  /** Default TTL in seconds (default: 3600 = 1 hour) */\n  ttl?: number\n  /** Expiration strategy (default: sliding) */\n  expirationStrategy?: ExpirationStrategy\n  /** Namespace/prefix for session keys */\n  namespace?: string\n  /** Enable session data encryption */\n  encryptData?: boolean\n  /** Encryption key (required if encryptData is true) */\n  encryptionKey?: string\n  /** Maximum concurrent sessions per user (0 = unlimited) */\n  maxSessionsPerUser?: number\n  /** Enable session locking for concurrent access */\n  enableLocking?: boolean\n  /** Lock timeout in milliseconds (default: 5000) */\n  lockTimeout?: number\n  /** Cleanup interval in milliseconds (default: 300000 = 5 minutes) */\n  cleanupInterval?: number\n  /** Enable automatic cleanup of expired sessions */\n  autoCleanup?: boolean\n}\n\n/**\n * Configuration for in-memory session store\n */\nexport interface InMemorySessionConfig extends BaseSessionConfig {\n  type: 'memory'\n  /** Maximum number of sessions to store (LRU eviction) */\n  maxSessions?: number\n}\n\n/**\n * Configuration for Redis session store\n */\nexport interface RedisSessionConfig extends BaseSessionConfig {\n  type: 'redis'\n  /** Redis connection URL */\n  url?: string\n  /** Redis host */\n  host?: string\n  /** Redis port */\n  port?: number\n  /** Redis password */\n  password?: string\n  /** Redis database number */\n  db?: number\n  /** Key prefix for Redis keys */\n  keyPrefix?: string\n}\n\n/**\n * Configuration for ZeroDB session store\n */\nexport interface ZeroDBSessionConfig extends BaseSessionConfig {\n  type: 'zerodb'\n  /** ZeroDB project ID */\n  projectId: string\n  /** ZeroDB API key */\n  apiKey: string\n  /** Table name for sessions */\n  tableName?: string\n}\n\n/**\n * Union type for all session configurations\n */\nexport type SessionConfig = InMemorySessionConfig | RedisSessionConfig | ZeroDBSessionConfig\n\n/**\n * Options for creating a new session\n */\nexport interface CreateSessionOptions {\n  /** Custom TTL in seconds (overrides default) */\n  ttl?: number\n  /** IP address of the client */\n  ipAddress?: string\n  /** User agent string */\n  userAgent?: string\n  /** Custom metadata */\n  metadata?: Record<string, any>\n}\n\n/**\n * Options for updating a session\n */\nexport interface UpdateSessionOptions {\n  /** Whether to update the lastAccessedAt timestamp */\n  updateLastAccessed?: boolean\n  /** Merge data instead of replacing */\n  merge?: boolean\n}\n\n/**\n * Options for refreshing a session\n */\nexport interface RefreshSessionOptions {\n  /** Custom TTL in seconds (overrides default) */\n  ttl?: number\n}\n\n/**\n * Options for listing sessions\n */\nexport interface ListSessionsOptions {\n  /** Include expired sessions */\n  includeExpired?: boolean\n  /** Limit number of results */\n  limit?: number\n  /** Offset for pagination */\n  offset?: number\n}\n\n/**\n * Session statistics\n */\nexport interface SessionStats {\n  /** Total number of sessions */\n  totalSessions: number\n  /** Number of active (non-expired) sessions */\n  activeSessions: number\n  /** Number of expired sessions */\n  expiredSessions: number\n  /** Sessions grouped by user ID */\n  sessionsByUser?: Record<string, number>\n  /** Average session duration in milliseconds */\n  averageDuration?: number\n}\n\n/**\n * Session store interface that all storage backends must implement\n */\nexport interface SessionStore {\n  /**\n   * Get a session by ID\n   */\n  get(sessionId: string): Promise<SessionData | null>\n\n  /**\n   * Set/update a session\n   */\n  set(sessionId: string, data: SessionData): Promise<void>\n\n  /**\n   * Delete a session\n   */\n  delete(sessionId: string): Promise<boolean>\n\n  /**\n   * Check if a session exists\n   */\n  exists(sessionId: string): Promise<boolean>\n\n  /**\n   * Get all sessions for a user\n   */\n  getByUserId(userId: string): Promise<Map<string, SessionData>>\n\n  /**\n   * Delete all sessions for a user\n   */\n  deleteByUserId(userId: string): Promise<number>\n\n  /**\n   * Get all session IDs\n   */\n  getAllSessionIds(): Promise<string[]>\n\n  /**\n   * Remove expired sessions\n   */\n  cleanup(): Promise<number>\n\n  /**\n   * Get session statistics\n   */\n  getStats(): Promise<SessionStats>\n\n  /**\n   * Acquire a lock for a session\n   */\n  acquireLock?(sessionId: string, timeout: number): Promise<boolean>\n\n  /**\n   * Release a lock for a session\n   */\n  releaseLock?(sessionId: string): Promise<void>\n\n  /**\n   * Close the store connection\n   */\n  close?(): Promise<void>\n}\n\n/**\n * Session event types\n */\nexport enum SessionEvent {\n  CREATED = 'session:created',\n  UPDATED = 'session:updated',\n  REFRESHED = 'session:refreshed',\n  DELETED = 'session:deleted',\n  EXPIRED = 'session:expired',\n  LOCKED = 'session:locked',\n  UNLOCKED = 'session:unlocked'\n}\n\n/**\n * Session event payload\n */\nexport interface SessionEventPayload {\n  /** Session ID */\n  sessionId: string\n  /** User ID */\n  userId: string\n  /** Event type */\n  event: SessionEvent\n  /** Timestamp */\n  timestamp: number\n  /** Additional data */\n  data?: Record<string, any>\n}\n","/**\n * In-memory session store implementation\n * Provides fast session storage using Maps with LRU eviction\n */\n\nimport {\n  SessionStore,\n  SessionData,\n  SessionStats\n} from './types'\n\n/**\n * LRU (Least Recently Used) entry for tracking access order\n */\ninterface LRUEntry {\n  sessionId: string\n  accessTime: number\n}\n\n/**\n * In-memory session store with LRU eviction\n */\nexport class InMemorySessionStore implements SessionStore {\n  private sessions: Map<string, SessionData>\n  private userSessions: Map<string, Set<string>>\n  private locks: Map<string, number>\n  private accessOrder: LRUEntry[]\n  private maxSessions: number\n\n  constructor(maxSessions: number = 10000) {\n    this.sessions = new Map()\n    this.userSessions = new Map()\n    this.locks = new Map()\n    this.accessOrder = []\n    this.maxSessions = maxSessions\n  }\n\n  /**\n   * Get a session by ID\n   */\n  async get(sessionId: string): Promise<SessionData | null> {\n    const session = this.sessions.get(sessionId)\n    if (!session) {\n      return null\n    }\n\n    // Update access order for LRU\n    this.updateAccessOrder(sessionId)\n\n    return { ...session }\n  }\n\n  /**\n   * Set/update a session\n   */\n  async set(sessionId: string, data: SessionData): Promise<void> {\n    // Check if we need to evict old sessions\n    if (!this.sessions.has(sessionId) && this.sessions.size >= this.maxSessions) {\n      this.evictOldest()\n    }\n\n    // Store session\n    this.sessions.set(sessionId, { ...data })\n\n    // Update user sessions index\n    const userSessionSet = this.userSessions.get(data.userId) || new Set()\n    userSessionSet.add(sessionId)\n    this.userSessions.set(data.userId, userSessionSet)\n\n    // Update access order\n    this.updateAccessOrder(sessionId)\n  }\n\n  /**\n   * Delete a session\n   */\n  async delete(sessionId: string): Promise<boolean> {\n    const session = this.sessions.get(sessionId)\n    if (!session) {\n      return false\n    }\n\n    // Remove from sessions map\n    this.sessions.delete(sessionId)\n\n    // Remove from user sessions index\n    const userSessionSet = this.userSessions.get(session.userId)\n    if (userSessionSet) {\n      userSessionSet.delete(sessionId)\n      if (userSessionSet.size === 0) {\n        this.userSessions.delete(session.userId)\n      }\n    }\n\n    // Remove from access order\n    this.accessOrder = this.accessOrder.filter(entry => entry.sessionId !== sessionId)\n\n    // Remove lock if exists\n    this.locks.delete(sessionId)\n\n    return true\n  }\n\n  /**\n   * Check if a session exists\n   */\n  async exists(sessionId: string): Promise<boolean> {\n    return this.sessions.has(sessionId)\n  }\n\n  /**\n   * Get all sessions for a user\n   */\n  async getByUserId(userId: string): Promise<Map<string, SessionData>> {\n    const result = new Map<string, SessionData>()\n    const sessionIds = this.userSessions.get(userId)\n\n    if (!sessionIds) {\n      return result\n    }\n\n    Array.from(sessionIds).forEach(sessionId => {\n      const session = this.sessions.get(sessionId)\n      if (session) {\n        result.set(sessionId, { ...session })\n      }\n    })\n\n    return result\n  }\n\n  /**\n   * Delete all sessions for a user\n   */\n  async deleteByUserId(userId: string): Promise<number> {\n    const sessionIds = this.userSessions.get(userId)\n    if (!sessionIds) {\n      return 0\n    }\n\n    let deletedCount = 0\n    const sessionIdArray = Array.from(sessionIds)\n    for (const sessionId of sessionIdArray) {\n      const deleted = await this.delete(sessionId)\n      if (deleted) {\n        deletedCount++\n      }\n    }\n\n    return deletedCount\n  }\n\n  /**\n   * Get all session IDs\n   */\n  async getAllSessionIds(): Promise<string[]> {\n    return Array.from(this.sessions.keys())\n  }\n\n  /**\n   * Remove expired sessions\n   */\n  async cleanup(): Promise<number> {\n    const now = Date.now()\n    let cleanedCount = 0\n    const expiredSessionIds: string[] = []\n\n    // Find expired sessions\n    Array.from(this.sessions.entries()).forEach(([sessionId, session]) => {\n      if (session.expiresAt <= now) {\n        expiredSessionIds.push(sessionId)\n      }\n    })\n\n    // Delete expired sessions\n    for (const sessionId of expiredSessionIds) {\n      const deleted = await this.delete(sessionId)\n      if (deleted) {\n        cleanedCount++\n      }\n    }\n\n    return cleanedCount\n  }\n\n  /**\n   * Get session statistics\n   */\n  async getStats(): Promise<SessionStats> {\n    const now = Date.now()\n    let activeSessions = 0\n    let expiredSessions = 0\n    let totalDuration = 0\n    const sessionsByUser: Record<string, number> = {}\n\n    Array.from(this.sessions.entries()).forEach(([, session]) => {\n      if (session.expiresAt > now) {\n        activeSessions++\n      } else {\n        expiredSessions++\n      }\n\n      // Track sessions by user\n      sessionsByUser[session.userId] = (sessionsByUser[session.userId] || 0) + 1\n\n      // Calculate duration\n      const duration = session.lastAccessedAt - session.createdAt\n      totalDuration += duration\n    })\n\n    const totalSessions = this.sessions.size\n    const averageDuration = totalSessions > 0 ? totalDuration / totalSessions : 0\n\n    return {\n      totalSessions,\n      activeSessions,\n      expiredSessions,\n      sessionsByUser,\n      averageDuration\n    }\n  }\n\n  /**\n   * Acquire a lock for a session\n   */\n  async acquireLock(sessionId: string, timeout: number): Promise<boolean> {\n    const now = Date.now()\n    const existingLock = this.locks.get(sessionId)\n\n    // Check if lock exists and is still valid\n    if (existingLock && existingLock > now) {\n      return false\n    }\n\n    // Acquire lock\n    this.locks.set(sessionId, now + timeout)\n    return true\n  }\n\n  /**\n   * Release a lock for a session\n   */\n  async releaseLock(sessionId: string): Promise<void> {\n    this.locks.delete(sessionId)\n  }\n\n  /**\n   * Update access order for LRU tracking\n   */\n  private updateAccessOrder(sessionId: string): void {\n    // Remove existing entry\n    this.accessOrder = this.accessOrder.filter(entry => entry.sessionId !== sessionId)\n\n    // Add to end (most recently used)\n    this.accessOrder.push({\n      sessionId,\n      accessTime: Date.now()\n    })\n  }\n\n  /**\n   * Evict the oldest (least recently used) session\n   */\n  private evictOldest(): void {\n    if (this.accessOrder.length === 0) {\n      return\n    }\n\n    // Get least recently used session\n    const oldest = this.accessOrder[0]\n    if (oldest) {\n      this.delete(oldest.sessionId)\n    }\n  }\n\n  /**\n   * Get the number of sessions in the store\n   */\n  get size(): number {\n    return this.sessions.size\n  }\n\n  /**\n   * Clear all sessions (for testing)\n   */\n  async clear(): Promise<void> {\n    this.sessions.clear()\n    this.userSessions.clear()\n    this.locks.clear()\n    this.accessOrder = []\n  }\n}\n","/**\n * Redis session store implementation\n * Provides persistent, distributed session storage using Redis\n */\n\nimport Redis, { RedisOptions } from 'ioredis'\nimport {\n  SessionStore,\n  SessionData,\n  SessionStats,\n  RedisSessionConfig\n} from './types'\n\n/**\n * Redis session store with automatic expiration\n */\nexport class RedisSessionStore implements SessionStore {\n  private redis: Redis\n  private keyPrefix: string\n  private userIndexPrefix: string\n\n  constructor(config: Omit<RedisSessionConfig, 'type'>) {\n    const redisOptions: RedisOptions = {\n      host: config.host || 'localhost',\n      port: config.port || 6379,\n      password: config.password,\n      db: config.db || 0,\n      keyPrefix: config.keyPrefix || 'session:'\n    }\n\n    if (config.url) {\n      this.redis = new Redis(config.url, redisOptions)\n    } else {\n      this.redis = new Redis(redisOptions)\n    }\n\n    this.keyPrefix = config.keyPrefix || 'session:'\n    this.userIndexPrefix = `${this.keyPrefix}user:`\n  }\n\n  /**\n   * Get the full Redis key for a session\n   */\n  private getSessionKey(sessionId: string): string {\n    return `${this.keyPrefix}${sessionId}`\n  }\n\n  /**\n   * Get the user index key\n   */\n  private getUserIndexKey(userId: string): string {\n    return `${this.userIndexPrefix}${userId}`\n  }\n\n  /**\n   * Get a session by ID\n   */\n  async get(sessionId: string): Promise<SessionData | null> {\n    const key = this.getSessionKey(sessionId)\n    const data = await this.redis.get(key)\n\n    if (!data) {\n      return null\n    }\n\n    try {\n      return JSON.parse(data) as SessionData\n    } catch (error) {\n      console.error('Failed to parse session data:', error)\n      return null\n    }\n  }\n\n  /**\n   * Set/update a session\n   */\n  async set(sessionId: string, data: SessionData): Promise<void> {\n    const key = this.getSessionKey(sessionId)\n    const userIndexKey = this.getUserIndexKey(data.userId)\n\n    // Calculate TTL in seconds\n    const ttl = Math.ceil((data.expiresAt - Date.now()) / 1000)\n\n    if (ttl <= 0) {\n      // Session already expired, don't store it\n      return\n    }\n\n    // Use pipeline for atomic operations\n    const pipeline = this.redis.pipeline()\n\n    // Store session data with expiration\n    pipeline.setex(key, ttl, JSON.stringify(data))\n\n    // Add session ID to user index\n    pipeline.sadd(userIndexKey, sessionId)\n\n    // Set expiration on user index (slightly longer than session)\n    pipeline.expire(userIndexKey, ttl + 60)\n\n    await pipeline.exec()\n  }\n\n  /**\n   * Delete a session\n   */\n  async delete(sessionId: string): Promise<boolean> {\n    const key = this.getSessionKey(sessionId)\n\n    // Get session to find user ID\n    const session = await this.get(sessionId)\n    if (!session) {\n      return false\n    }\n\n    const userIndexKey = this.getUserIndexKey(session.userId)\n\n    // Use pipeline for atomic operations\n    const pipeline = this.redis.pipeline()\n    pipeline.del(key)\n    pipeline.srem(userIndexKey, sessionId)\n\n    await pipeline.exec()\n\n    return true\n  }\n\n  /**\n   * Check if a session exists\n   */\n  async exists(sessionId: string): Promise<boolean> {\n    const key = this.getSessionKey(sessionId)\n    const result = await this.redis.exists(key)\n    return result === 1\n  }\n\n  /**\n   * Get all sessions for a user\n   */\n  async getByUserId(userId: string): Promise<Map<string, SessionData>> {\n    const userIndexKey = this.getUserIndexKey(userId)\n    const sessionIds = await this.redis.smembers(userIndexKey)\n\n    const result = new Map<string, SessionData>()\n\n    // Fetch all sessions in parallel\n    const sessions = await Promise.all(\n      sessionIds.map(sessionId => this.get(sessionId))\n    )\n\n    // Add non-null sessions to result\n    sessionIds.forEach((sessionId, index) => {\n      const session = sessions[index]\n      if (session) {\n        result.set(sessionId, session)\n      }\n    })\n\n    return result\n  }\n\n  /**\n   * Delete all sessions for a user\n   */\n  async deleteByUserId(userId: string): Promise<number> {\n    const userIndexKey = this.getUserIndexKey(userId)\n    const sessionIds = await this.redis.smembers(userIndexKey)\n\n    if (sessionIds.length === 0) {\n      return 0\n    }\n\n    // Delete all sessions\n    const pipeline = this.redis.pipeline()\n\n    for (const sessionId of sessionIds) {\n      const key = this.getSessionKey(sessionId)\n      pipeline.del(key)\n    }\n\n    // Delete user index\n    pipeline.del(userIndexKey)\n\n    await pipeline.exec()\n\n    return sessionIds.length\n  }\n\n  /**\n   * Get all session IDs\n   */\n  async getAllSessionIds(): Promise<string[]> {\n    const pattern = `${this.keyPrefix}*`\n    const keys = await this.redis.keys(pattern)\n\n    return keys\n      .map(key => key.replace(this.keyPrefix, ''))\n      .filter(sessionId => !sessionId.startsWith('user:'))\n  }\n\n  /**\n   * Remove expired sessions\n   * Note: Redis handles expiration automatically, so this is a no-op\n   */\n  async cleanup(): Promise<number> {\n    // Redis automatically removes expired keys\n    // We can clean up orphaned user index entries\n    const userIndexPattern = `${this.userIndexPrefix}*`\n    const userIndexKeys = await this.redis.keys(userIndexPattern)\n\n    let cleanedCount = 0\n\n    for (const userIndexKey of userIndexKeys) {\n      const sessionIds = await this.redis.smembers(userIndexKey)\n      const orphanedIds: string[] = []\n\n      // Check which sessions no longer exist\n      for (const sessionId of sessionIds) {\n        const exists = await this.exists(sessionId)\n        if (!exists) {\n          orphanedIds.push(sessionId)\n        }\n      }\n\n      // Remove orphaned session IDs from user index\n      if (orphanedIds.length > 0) {\n        await this.redis.srem(userIndexKey, ...orphanedIds)\n        cleanedCount += orphanedIds.length\n      }\n\n      // Remove user index if empty\n      const remainingCount = await this.redis.scard(userIndexKey)\n      if (remainingCount === 0) {\n        await this.redis.del(userIndexKey)\n      }\n    }\n\n    return cleanedCount\n  }\n\n  /**\n   * Get session statistics\n   */\n  async getStats(): Promise<SessionStats> {\n    const sessionIds = await this.getAllSessionIds()\n    const now = Date.now()\n\n    let activeSessions = 0\n    let expiredSessions = 0\n    let totalDuration = 0\n    const sessionsByUser: Record<string, number> = {}\n\n    // Fetch all sessions in parallel\n    const sessions = await Promise.all(\n      sessionIds.map(sessionId => this.get(sessionId))\n    )\n\n    for (const session of sessions) {\n      if (!session) {\n        continue\n      }\n\n      if (session.expiresAt > now) {\n        activeSessions++\n      } else {\n        expiredSessions++\n      }\n\n      // Track sessions by user\n      sessionsByUser[session.userId] = (sessionsByUser[session.userId] || 0) + 1\n\n      // Calculate duration\n      const duration = session.lastAccessedAt - session.createdAt\n      totalDuration += duration\n    }\n\n    const totalSessions = sessions.filter(s => s !== null).length\n    const averageDuration = totalSessions > 0 ? totalDuration / totalSessions : 0\n\n    return {\n      totalSessions,\n      activeSessions,\n      expiredSessions,\n      sessionsByUser,\n      averageDuration\n    }\n  }\n\n  /**\n   * Acquire a lock for a session using Redis SET NX\n   */\n  async acquireLock(sessionId: string, timeout: number): Promise<boolean> {\n    const lockKey = `${this.keyPrefix}lock:${sessionId}`\n    const ttl = Math.ceil(timeout / 1000)\n\n    // Try to set lock with NX (only if not exists) and EX (expiration)\n    const result = await this.redis.set(lockKey, '1', 'EX', ttl, 'NX')\n\n    return result === 'OK'\n  }\n\n  /**\n   * Release a lock for a session\n   */\n  async releaseLock(sessionId: string): Promise<void> {\n    const lockKey = `${this.keyPrefix}lock:${sessionId}`\n    await this.redis.del(lockKey)\n  }\n\n  /**\n   * Close the Redis connection\n   */\n  async close(): Promise<void> {\n    await this.redis.quit()\n  }\n}\n","/**\n * ZeroDB session store implementation\n * Provides persistent, encrypted session storage using ZeroDB\n */\n\nimport {\n  SessionStore,\n  SessionData,\n  SessionStats,\n  ZeroDBSessionConfig\n} from './types'\n\n/**\n * ZeroDB session store with encryption support\n */\nexport class ZeroDBSessionStore implements SessionStore {\n  private projectId: string\n  private apiKey: string\n  private tableName: string\n  private baseUrl: string\n\n  constructor(config: Omit<ZeroDBSessionConfig, 'type'>) {\n    this.projectId = config.projectId\n    this.apiKey = config.apiKey\n    this.tableName = config.tableName || 'sessions'\n    this.baseUrl = 'https://api.zerodb.io/v1'\n  }\n\n  /**\n   * Make an authenticated request to ZeroDB\n   */\n  private async request(\n    method: string,\n    endpoint: string,\n    body?: any\n  ): Promise<any> {\n    const url = `${this.baseUrl}${endpoint}`\n\n    const response = await fetch(url, {\n      method,\n      headers: {\n        'Content-Type': 'application/json',\n        'Authorization': `Bearer ${this.apiKey}`,\n        'X-Project-ID': this.projectId\n      },\n      body: body ? JSON.stringify(body) : undefined\n    })\n\n    if (!response.ok) {\n      const error = await response.text()\n      throw new Error(`ZeroDB request failed: ${response.status} ${error}`)\n    }\n\n    return response.json()\n  }\n\n  /**\n   * Initialize the sessions table if it doesn't exist\n   */\n  async initialize(): Promise<void> {\n    try {\n      await this.request('POST', '/tables', {\n        name: this.tableName,\n        schema: {\n          sessionId: { type: 'string', primary: true },\n          userId: { type: 'string', indexed: true },\n          data: { type: 'json' },\n          createdAt: { type: 'number' },\n          lastAccessedAt: { type: 'number' },\n          expiresAt: { type: 'number', indexed: true },\n          ipAddress: { type: 'string', optional: true },\n          userAgent: { type: 'string', optional: true },\n          metadata: { type: 'json', optional: true }\n        }\n      })\n    } catch (error) {\n      // Table might already exist, ignore error\n      if (!(error instanceof Error) || !error.message.includes('already exists')) {\n        console.warn('Failed to initialize sessions table:', error)\n      }\n    }\n  }\n\n  /**\n   * Get a session by ID\n   */\n  async get(sessionId: string): Promise<SessionData | null> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/query`,\n        {\n          filter: { sessionId },\n          limit: 1\n        }\n      )\n\n      if (!response.rows || response.rows.length === 0) {\n        return null\n      }\n\n      const row = response.rows[0]\n      return {\n        userId: row.userId,\n        data: row.data,\n        createdAt: row.createdAt,\n        lastAccessedAt: row.lastAccessedAt,\n        expiresAt: row.expiresAt,\n        ipAddress: row.ipAddress,\n        userAgent: row.userAgent,\n        metadata: row.metadata\n      }\n    } catch (error) {\n      console.error('Failed to get session:', error)\n      return null\n    }\n  }\n\n  /**\n   * Set/update a session\n   */\n  async set(sessionId: string, data: SessionData): Promise<void> {\n    try {\n      await this.request('POST', `/tables/${this.tableName}/upsert`, {\n        rows: [\n          {\n            sessionId,\n            userId: data.userId,\n            data: data.data,\n            createdAt: data.createdAt,\n            lastAccessedAt: data.lastAccessedAt,\n            expiresAt: data.expiresAt,\n            ipAddress: data.ipAddress,\n            userAgent: data.userAgent,\n            metadata: data.metadata\n          }\n        ]\n      })\n    } catch (error) {\n      throw new Error(`Failed to set session: ${error}`)\n    }\n  }\n\n  /**\n   * Delete a session\n   */\n  async delete(sessionId: string): Promise<boolean> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/delete`,\n        {\n          filter: { sessionId }\n        }\n      )\n\n      return response.deletedCount > 0\n    } catch (error) {\n      console.error('Failed to delete session:', error)\n      return false\n    }\n  }\n\n  /**\n   * Check if a session exists\n   */\n  async exists(sessionId: string): Promise<boolean> {\n    const session = await this.get(sessionId)\n    return session !== null\n  }\n\n  /**\n   * Get all sessions for a user\n   */\n  async getByUserId(userId: string): Promise<Map<string, SessionData>> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/query`,\n        {\n          filter: { userId }\n        }\n      )\n\n      const result = new Map<string, SessionData>()\n\n      if (response.rows) {\n        for (const row of response.rows) {\n          result.set(row.sessionId, {\n            userId: row.userId,\n            data: row.data,\n            createdAt: row.createdAt,\n            lastAccessedAt: row.lastAccessedAt,\n            expiresAt: row.expiresAt,\n            ipAddress: row.ipAddress,\n            userAgent: row.userAgent,\n            metadata: row.metadata\n          })\n        }\n      }\n\n      return result\n    } catch (error) {\n      console.error('Failed to get sessions by user ID:', error)\n      return new Map()\n    }\n  }\n\n  /**\n   * Delete all sessions for a user\n   */\n  async deleteByUserId(userId: string): Promise<number> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/delete`,\n        {\n          filter: { userId }\n        }\n      )\n\n      return response.deletedCount || 0\n    } catch (error) {\n      console.error('Failed to delete sessions by user ID:', error)\n      return 0\n    }\n  }\n\n  /**\n   * Get all session IDs\n   */\n  async getAllSessionIds(): Promise<string[]> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/query`,\n        {\n          select: ['sessionId']\n        }\n      )\n\n      if (!response.rows) {\n        return []\n      }\n\n      return response.rows.map((row: any) => row.sessionId)\n    } catch (error) {\n      console.error('Failed to get all session IDs:', error)\n      return []\n    }\n  }\n\n  /**\n   * Remove expired sessions\n   */\n  async cleanup(): Promise<number> {\n    try {\n      const now = Date.now()\n\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/delete`,\n        {\n          filter: {\n            expiresAt: { $lte: now }\n          }\n        }\n      )\n\n      return response.deletedCount || 0\n    } catch (error) {\n      console.error('Failed to cleanup expired sessions:', error)\n      return 0\n    }\n  }\n\n  /**\n   * Get session statistics\n   */\n  async getStats(): Promise<SessionStats> {\n    try {\n      const response = await this.request(\n        'POST',\n        `/tables/${this.tableName}/query`,\n        {}\n      )\n\n      const now = Date.now()\n      let activeSessions = 0\n      let expiredSessions = 0\n      let totalDuration = 0\n      const sessionsByUser: Record<string, number> = {}\n\n      if (response.rows) {\n        for (const row of response.rows) {\n          if (row.expiresAt > now) {\n            activeSessions++\n          } else {\n            expiredSessions++\n          }\n\n          // Track sessions by user\n          sessionsByUser[row.userId] = (sessionsByUser[row.userId] || 0) + 1\n\n          // Calculate duration\n          const duration = row.lastAccessedAt - row.createdAt\n          totalDuration += duration\n        }\n      }\n\n      const totalSessions = response.rows ? response.rows.length : 0\n      const averageDuration = totalSessions > 0 ? totalDuration / totalSessions : 0\n\n      return {\n        totalSessions,\n        activeSessions,\n        expiredSessions,\n        sessionsByUser,\n        averageDuration\n      }\n    } catch (error) {\n      console.error('Failed to get session stats:', error)\n      return {\n        totalSessions: 0,\n        activeSessions: 0,\n        expiredSessions: 0\n      }\n    }\n  }\n\n  /**\n   * Acquire a lock for a session\n   * Note: ZeroDB doesn't natively support locks, so we use a separate locks table\n   */\n  async acquireLock(sessionId: string, timeout: number): Promise<boolean> {\n    try {\n      const now = Date.now()\n      const expiresAt = now + timeout\n\n      // Try to insert lock\n      await this.request('POST', `/tables/session_locks/upsert`, {\n        rows: [\n          {\n            sessionId,\n            expiresAt,\n            createdAt: now\n          }\n        ]\n      })\n\n      return true\n    } catch (error) {\n      // Lock might already exist\n      return false\n    }\n  }\n\n  /**\n   * Release a lock for a session\n   */\n  async releaseLock(sessionId: string): Promise<void> {\n    try {\n      await this.request('POST', `/tables/session_locks/delete`, {\n        filter: { sessionId }\n      })\n    } catch (error) {\n      console.error('Failed to release lock:', error)\n    }\n  }\n\n  /**\n   * Close the store connection\n   */\n  async close(): Promise<void> {\n    // No persistent connection to close\n  }\n}\n","/**\n * Session Manager - Comprehensive session management for AI applications\n * Supports multiple storage backends, expiration strategies, and security features\n */\n\nimport { createHash, createCipheriv, createDecipheriv, randomBytes } from 'crypto'\nimport { generateId } from '../utils/id'\nimport { InMemorySessionStore } from './InMemorySessionStore'\nimport { RedisSessionStore } from './RedisSessionStore'\nimport { ZeroDBSessionStore } from './ZeroDBSessionStore'\nimport {\n  SessionConfig,\n  SessionStore,\n  Session,\n  SessionData,\n  CreateSessionOptions,\n  UpdateSessionOptions,\n  RefreshSessionOptions,\n  ListSessionsOptions,\n  SessionStats,\n  ExpirationStrategy,\n  SessionEvent,\n  SessionEventPayload\n} from './types'\n\n/**\n * Event listener for session events\n */\ntype SessionEventListener = (payload: SessionEventPayload) => void\n\n/**\n * SessionManager - Main class for managing user sessions\n */\nexport class SessionManager {\n  private store: SessionStore\n  private defaultTTL: number\n  private expirationStrategy: ExpirationStrategy\n  private encryptData: boolean\n  private encryptionKey?: Buffer\n  private maxSessionsPerUser: number\n  private enableLocking: boolean\n  private lockTimeout: number\n  private cleanupInterval?: NodeJS.Timeout\n  private eventListeners: Map<SessionEvent, Set<SessionEventListener>>\n\n  constructor(config: SessionConfig) {\n    this.defaultTTL = config.ttl || 3600 // Default: 1 hour\n    this.expirationStrategy = config.expirationStrategy || ExpirationStrategy.SLIDING\n    this.encryptData = config.encryptData || false\n    this.maxSessionsPerUser = config.maxSessionsPerUser || 0 // 0 = unlimited\n    this.enableLocking = config.enableLocking || false\n    this.lockTimeout = config.lockTimeout || 5000\n    this.eventListeners = new Map()\n\n    // Validate encryption configuration\n    if (this.encryptData && !config.encryptionKey) {\n      throw new Error('encryptionKey is required when encryptData is enabled')\n    }\n\n    if (this.encryptData && config.encryptionKey) {\n      // Derive encryption key from provided key\n      this.encryptionKey = createHash('sha256')\n        .update(config.encryptionKey)\n        .digest()\n    }\n\n    // Initialize store based on configuration\n    this.store = this.createStore(config)\n\n    // Set up automatic cleanup if enabled\n    if (config.autoCleanup !== false) {\n      const interval = config.cleanupInterval || 300000 // Default: 5 minutes\n      this.cleanupInterval = setInterval(() => {\n        this.cleanup().catch(error => {\n          console.error('Session cleanup error:', error)\n        })\n      }, interval)\n    }\n  }\n\n  /**\n   * Create the appropriate store based on configuration\n   */\n  private createStore(config: SessionConfig): SessionStore {\n    switch (config.type) {\n      case 'memory':\n        return new InMemorySessionStore(config.maxSessions)\n\n      case 'redis':\n        return new RedisSessionStore(config)\n\n      case 'zerodb':\n        const store = new ZeroDBSessionStore(config)\n        // Initialize ZeroDB table\n        store.initialize().catch(error => {\n          console.error('Failed to initialize ZeroDB store:', error)\n        })\n        return store\n\n      default:\n        throw new Error(`Unsupported store type: ${(config as any).type}`)\n    }\n  }\n\n  /**\n   * Create a new session\n   */\n  async create(\n    userId: string,\n    data: Record<string, any> = {},\n    options: CreateSessionOptions = {}\n  ): Promise<Session> {\n    // Check max sessions per user\n    if (this.maxSessionsPerUser > 0) {\n      const userSessions = await this.store.getByUserId(userId)\n      if (userSessions.size >= this.maxSessionsPerUser) {\n        // Delete oldest session\n        const sessions = Array.from(userSessions.entries())\n        sessions.sort((a, b) => a[1].createdAt - b[1].createdAt)\n        const oldestSession = sessions[0]\n        if (oldestSession) {\n          const oldestSessionId = oldestSession[0]\n          await this.delete(oldestSessionId)\n        }\n      }\n    }\n\n    // Generate session ID\n    const sessionId = generateId('sess')\n\n    // Calculate expiration\n    const now = Date.now()\n    const ttl = options.ttl || this.defaultTTL\n    const expiresAt = now + (ttl * 1000)\n\n    // Encrypt data if enabled\n    const sessionData: SessionData = {\n      userId,\n      data: this.encryptData ? this.encrypt(data) : data,\n      createdAt: now,\n      lastAccessedAt: now,\n      expiresAt,\n      ipAddress: options.ipAddress,\n      userAgent: options.userAgent,\n      metadata: options.metadata\n    }\n\n    // Store session\n    await this.store.set(sessionId, sessionData)\n\n    // Emit event\n    this.emit(SessionEvent.CREATED, {\n      sessionId,\n      userId,\n      event: SessionEvent.CREATED,\n      timestamp: now\n    })\n\n    // Return session\n    return this.toSession(sessionId, sessionData)\n  }\n\n  /**\n   * Get a session by ID\n   */\n  async get(sessionId: string): Promise<Session | null> {\n    const sessionData = await this.store.get(sessionId)\n    if (!sessionData) {\n      return null\n    }\n\n    // Check if expired\n    if (sessionData.expiresAt <= Date.now()) {\n      await this.delete(sessionId)\n      this.emit(SessionEvent.EXPIRED, {\n        sessionId,\n        userId: sessionData.userId,\n        event: SessionEvent.EXPIRED,\n        timestamp: Date.now()\n      })\n      return null\n    }\n\n    // Update last accessed time for sliding expiration\n    if (this.expirationStrategy === ExpirationStrategy.SLIDING ||\n        this.expirationStrategy === ExpirationStrategy.HYBRID) {\n      sessionData.lastAccessedAt = Date.now()\n\n      // Extend expiration for sliding strategy\n      if (this.expirationStrategy === ExpirationStrategy.SLIDING) {\n        sessionData.expiresAt = Date.now() + (this.defaultTTL * 1000)\n      }\n\n      await this.store.set(sessionId, sessionData)\n    }\n\n    return this.toSession(sessionId, sessionData)\n  }\n\n  /**\n   * Update a session's data\n   */\n  async update(\n    sessionId: string,\n    data: Record<string, any>,\n    options: UpdateSessionOptions = {}\n  ): Promise<Session | null> {\n    // Acquire lock if enabled\n    if (this.enableLocking) {\n      const locked = await this.acquireLock(sessionId)\n      if (!locked) {\n        throw new Error(`Failed to acquire lock for session ${sessionId}`)\n      }\n    }\n\n    try {\n      const sessionData = await this.store.get(sessionId)\n      if (!sessionData) {\n        return null\n      }\n\n      // Check if expired\n      if (sessionData.expiresAt <= Date.now()) {\n        await this.delete(sessionId)\n        return null\n      }\n\n      // Merge or replace data\n      if (options.merge) {\n        const existingData = this.encryptData ? this.decrypt(sessionData.data) : sessionData.data\n        const mergedData = { ...existingData, ...data }\n        sessionData.data = this.encryptData ? this.encrypt(mergedData) : mergedData\n      } else {\n        sessionData.data = this.encryptData ? this.encrypt(data) : data\n      }\n\n      // Update last accessed time\n      if (options.updateLastAccessed !== false) {\n        sessionData.lastAccessedAt = Date.now()\n\n        // Extend expiration for sliding strategy\n        if (this.expirationStrategy === ExpirationStrategy.SLIDING) {\n          sessionData.expiresAt = Date.now() + (this.defaultTTL * 1000)\n        }\n      }\n\n      // Store updated session\n      await this.store.set(sessionId, sessionData)\n\n      // Emit event\n      this.emit(SessionEvent.UPDATED, {\n        sessionId,\n        userId: sessionData.userId,\n        event: SessionEvent.UPDATED,\n        timestamp: Date.now()\n      })\n\n      return this.toSession(sessionId, sessionData)\n    } finally {\n      // Release lock\n      if (this.enableLocking) {\n        await this.releaseLock(sessionId)\n      }\n    }\n  }\n\n  /**\n   * Delete a session\n   */\n  async delete(sessionId: string): Promise<boolean> {\n    const sessionData = await this.store.get(sessionId)\n    const deleted = await this.store.delete(sessionId)\n\n    if (deleted && sessionData) {\n      this.emit(SessionEvent.DELETED, {\n        sessionId,\n        userId: sessionData.userId,\n        event: SessionEvent.DELETED,\n        timestamp: Date.now()\n      })\n    }\n\n    return deleted\n  }\n\n  /**\n   * Refresh/extend a session's expiration\n   */\n  async refresh(\n    sessionId: string,\n    options: RefreshSessionOptions = {}\n  ): Promise<Session | null> {\n    const sessionData = await this.store.get(sessionId)\n    if (!sessionData) {\n      return null\n    }\n\n    // Check if already expired\n    if (sessionData.expiresAt <= Date.now()) {\n      await this.delete(sessionId)\n      return null\n    }\n\n    // Extend expiration\n    const ttl = options.ttl || this.defaultTTL\n    sessionData.expiresAt = Date.now() + (ttl * 1000)\n    sessionData.lastAccessedAt = Date.now()\n\n    await this.store.set(sessionId, sessionData)\n\n    // Emit event\n    this.emit(SessionEvent.REFRESHED, {\n      sessionId,\n      userId: sessionData.userId,\n      event: SessionEvent.REFRESHED,\n      timestamp: Date.now()\n    })\n\n    return this.toSession(sessionId, sessionData)\n  }\n\n  /**\n   * Get all sessions for a user\n   */\n  async getUserSessions(userId: string): Promise<Session[]> {\n    const sessionsMap = await this.store.getByUserId(userId)\n    const sessions: Session[] = []\n    const now = Date.now()\n\n    Array.from(sessionsMap.entries()).forEach(([sessionId, sessionData]) => {\n      // Skip expired sessions\n      if (sessionData.expiresAt > now) {\n        sessions.push(this.toSession(sessionId, sessionData))\n      }\n    })\n\n    return sessions\n  }\n\n  /**\n   * Delete all sessions for a user\n   */\n  async deleteUserSessions(userId: string): Promise<number> {\n    return await this.store.deleteByUserId(userId)\n  }\n\n  /**\n   * List sessions with optional filters\n   */\n  async list(options: ListSessionsOptions = {}): Promise<Session[]> {\n    const sessionIds = await this.store.getAllSessionIds()\n    const sessions: Session[] = []\n    const now = Date.now()\n\n    const limit = options.limit || 100\n    const offset = options.offset || 0\n    let count = 0\n    let skipped = 0\n\n    for (const sessionId of sessionIds) {\n      if (count >= limit) {\n        break\n      }\n\n      const sessionData = await this.store.get(sessionId)\n      if (!sessionData) {\n        continue\n      }\n\n      // Filter expired sessions\n      const isExpired = sessionData.expiresAt <= now\n      if (isExpired && !options.includeExpired) {\n        continue\n      }\n\n      // Handle offset\n      if (skipped < offset) {\n        skipped++\n        continue\n      }\n\n      sessions.push(this.toSession(sessionId, sessionData))\n      count++\n    }\n\n    return sessions\n  }\n\n  /**\n   * Validate if a session is active\n   */\n  async validate(sessionId: string): Promise<boolean> {\n    const session = await this.get(sessionId)\n    return session !== null && !session.isExpired\n  }\n\n  /**\n   * Clean up expired sessions\n   */\n  async cleanup(): Promise<number> {\n    return await this.store.cleanup()\n  }\n\n  /**\n   * Get session statistics\n   */\n  async getStats(): Promise<SessionStats> {\n    return await this.store.getStats()\n  }\n\n  /**\n   * Acquire a lock for a session\n   */\n  private async acquireLock(sessionId: string): Promise<boolean> {\n    if (!this.store.acquireLock) {\n      return true\n    }\n\n    const locked = await this.store.acquireLock(sessionId, this.lockTimeout)\n\n    if (locked) {\n      this.emit(SessionEvent.LOCKED, {\n        sessionId,\n        userId: '',\n        event: SessionEvent.LOCKED,\n        timestamp: Date.now()\n      })\n    }\n\n    return locked\n  }\n\n  /**\n   * Release a lock for a session\n   */\n  private async releaseLock(sessionId: string): Promise<void> {\n    if (!this.store.releaseLock) {\n      return\n    }\n\n    await this.store.releaseLock(sessionId)\n\n    this.emit(SessionEvent.UNLOCKED, {\n      sessionId,\n      userId: '',\n      event: SessionEvent.UNLOCKED,\n      timestamp: Date.now()\n    })\n  }\n\n  /**\n   * Convert SessionData to Session object\n   */\n  private toSession(sessionId: string, sessionData: SessionData): Session {\n    const now = Date.now()\n\n    return {\n      sessionId,\n      userId: sessionData.userId,\n      data: this.encryptData ? this.decrypt(sessionData.data) : sessionData.data,\n      createdAt: sessionData.createdAt,\n      lastAccessedAt: sessionData.lastAccessedAt,\n      expiresAt: sessionData.expiresAt,\n      isExpired: sessionData.expiresAt <= now,\n      ipAddress: sessionData.ipAddress,\n      userAgent: sessionData.userAgent,\n      metadata: sessionData.metadata\n    }\n  }\n\n  /**\n   * Encrypt session data\n   */\n  private encrypt(data: Record<string, any>): any {\n    if (!this.encryptionKey) {\n      return data\n    }\n\n    const json = JSON.stringify(data)\n    const iv = randomBytes(16)\n    const cipher = createCipheriv('aes-256-cbc', this.encryptionKey, iv)\n\n    let encrypted = cipher.update(json, 'utf8', 'hex')\n    encrypted += cipher.final('hex')\n\n    return {\n      encrypted: true,\n      iv: iv.toString('hex'),\n      data: encrypted\n    }\n  }\n\n  /**\n   * Decrypt session data\n   */\n  private decrypt(data: any): Record<string, any> {\n    if (!data || !data.encrypted || !this.encryptionKey) {\n      return data\n    }\n\n    const iv = Buffer.from(data.iv, 'hex')\n    const decipher = createDecipheriv('aes-256-cbc', this.encryptionKey, iv)\n\n    let decrypted = decipher.update(data.data, 'hex', 'utf8')\n    decrypted += decipher.final('utf8')\n\n    return JSON.parse(decrypted)\n  }\n\n  /**\n   * Register an event listener\n   */\n  on(event: SessionEvent, listener: SessionEventListener): void {\n    const listeners = this.eventListeners.get(event) || new Set()\n    listeners.add(listener)\n    this.eventListeners.set(event, listeners)\n  }\n\n  /**\n   * Remove an event listener\n   */\n  off(event: SessionEvent, listener: SessionEventListener): void {\n    const listeners = this.eventListeners.get(event)\n    if (listeners) {\n      listeners.delete(listener)\n    }\n  }\n\n  /**\n   * Emit a session event\n   */\n  private emit(event: SessionEvent, payload: SessionEventPayload): void {\n    const listeners = this.eventListeners.get(event)\n    if (listeners) {\n      Array.from(listeners).forEach(listener => {\n        try {\n          listener(payload)\n        } catch (error) {\n          console.error('Error in session event listener:', error)\n        }\n      })\n    }\n  }\n\n  /**\n   * Close the session manager and cleanup resources\n   */\n  async close(): Promise<void> {\n    // Clear cleanup interval\n    if (this.cleanupInterval) {\n      clearInterval(this.cleanupInterval)\n    }\n\n    // Close store connection\n    if (this.store.close) {\n      await this.store.close()\n    }\n\n    // Clear event listeners\n    this.eventListeners.clear()\n  }\n}\n","/**\n * Authentication types for AINative Auth integration\n */\n\n/**\n * Supported authentication methods\n */\nexport enum AuthMethod {\n  /** API Key authentication */\n  API_KEY = 'API_KEY',\n  /** OAuth 2.0 authentication */\n  OAUTH = 'OAUTH',\n  /** JSON Web Token authentication */\n  JWT = 'JWT',\n}\n\n/**\n * Authentication status\n */\nexport enum AuthStatus {\n  /** Not authenticated */\n  UNAUTHENTICATED = 'UNAUTHENTICATED',\n  /** Authentication in progress */\n  AUTHENTICATING = 'AUTHENTICATING',\n  /** Successfully authenticated */\n  AUTHENTICATED = 'AUTHENTICATED',\n  /** Authentication failed */\n  FAILED = 'FAILED',\n  /** Token expired, needs refresh */\n  EXPIRED = 'EXPIRED',\n  /** Token refreshing in progress */\n  REFRESHING = 'REFRESHING',\n}\n\n/**\n * Base credentials interface\n */\nexport interface BaseCredentials {\n  /** Authentication method */\n  method: AuthMethod;\n  /** Tenant ID for multi-tenant support */\n  tenantId?: string;\n}\n\n/**\n * API Key credentials\n */\nexport interface APIKeyCredentials extends BaseCredentials {\n  method: AuthMethod.API_KEY;\n  /** API key value */\n  apiKey: string;\n}\n\n/**\n * OAuth credentials\n */\nexport interface OAuthCredentials extends BaseCredentials {\n  method: AuthMethod.OAUTH;\n  /** Client ID */\n  clientId: string;\n  /** Client secret */\n  clientSecret: string;\n  /** OAuth scopes */\n  scopes?: string[];\n  /** Redirect URI for OAuth flow */\n  redirectUri?: string;\n}\n\n/**\n * JWT credentials\n */\nexport interface JWTCredentials extends BaseCredentials {\n  method: AuthMethod.JWT;\n  /** JWT token */\n  token: string;\n  /** Refresh token (optional) */\n  refreshToken?: string;\n}\n\n/**\n * Union type for all credential types\n */\nexport type AuthCredentials = APIKeyCredentials | OAuthCredentials | JWTCredentials;\n\n/**\n * Authentication configuration\n */\nexport interface AuthConfig {\n  /** AINative API base URL */\n  baseUrl?: string;\n  /** Authentication endpoint */\n  authEndpoint?: string;\n  /** Token refresh endpoint */\n  refreshEndpoint?: string;\n  /** Token validation endpoint */\n  validateEndpoint?: string;\n  /** Logout endpoint */\n  logoutEndpoint?: string;\n  /** Automatic token refresh (default: true) */\n  autoRefresh?: boolean;\n  /** Token refresh buffer in seconds (refresh before expiration) */\n  refreshBuffer?: number;\n  /** Request timeout in milliseconds */\n  timeout?: number;\n  /** Maximum retry attempts for failed requests */\n  maxRetries?: number;\n  /** Retry delay in milliseconds */\n  retryDelay?: number;\n  /** Enable request/response logging */\n  enableLogging?: boolean;\n  /** Custom headers to include in all requests */\n  customHeaders?: Record<string, string>;\n  /** Storage strategy for tokens */\n  storageStrategy?: StorageStrategy;\n}\n\n/**\n * Storage strategy for tokens\n */\nexport enum StorageStrategy {\n  /** Store in memory only (lost on restart) */\n  MEMORY = 'MEMORY',\n  /** Store in local storage (browser) */\n  LOCAL_STORAGE = 'LOCAL_STORAGE',\n  /** Store in session storage (browser) */\n  SESSION_STORAGE = 'SESSION_STORAGE',\n  /** Custom storage implementation */\n  CUSTOM = 'CUSTOM',\n}\n\n/**\n * Authentication session data\n */\nexport interface AuthSession {\n  /** Current authentication status */\n  status: AuthStatus;\n  /** Access token */\n  accessToken?: string;\n  /** Refresh token */\n  refreshToken?: string;\n  /** Token type (usually \"Bearer\") */\n  tokenType?: string;\n  /** Token expiration timestamp (Unix time in seconds) */\n  expiresAt?: number;\n  /** Token issued at timestamp (Unix time in seconds) */\n  issuedAt?: number;\n  /** Scopes granted */\n  scopes?: string[];\n  /** User information */\n  user?: UserInfo;\n  /** Tenant ID */\n  tenantId?: string;\n  /** Session metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * User information from authentication\n */\nexport interface UserInfo {\n  /** User ID */\n  id: string;\n  /** Email address */\n  email?: string;\n  /** Full name */\n  name?: string;\n  /** Username */\n  username?: string;\n  /** User roles */\n  roles?: string[];\n  /** User permissions */\n  permissions?: string[];\n  /** Additional user metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Token refresh options\n */\nexport interface TokenRefreshOptions {\n  /** Force refresh even if token not expired */\n  force?: boolean;\n  /** Retry on failure */\n  retry?: boolean;\n  /** Maximum retry attempts */\n  maxRetries?: number;\n}\n\n/**\n * Authentication error types\n */\nexport enum AuthErrorType {\n  /** Invalid credentials */\n  INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',\n  /** Network error */\n  NETWORK_ERROR = 'NETWORK_ERROR',\n  /** Token expired */\n  TOKEN_EXPIRED = 'TOKEN_EXPIRED',\n  /** Invalid token */\n  INVALID_TOKEN = 'INVALID_TOKEN',\n  /** Unauthorized access */\n  UNAUTHORIZED = 'UNAUTHORIZED',\n  /** Forbidden access */\n  FORBIDDEN = 'FORBIDDEN',\n  /** Rate limit exceeded */\n  RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED',\n  /** Server error */\n  SERVER_ERROR = 'SERVER_ERROR',\n  /** Configuration error */\n  CONFIG_ERROR = 'CONFIG_ERROR',\n  /** Unknown error */\n  UNKNOWN = 'UNKNOWN',\n}\n\n/**\n * Authentication error\n */\nexport class AuthError extends Error {\n  /** Error type */\n  type: AuthErrorType;\n  /** HTTP status code (if applicable) */\n  statusCode?: number;\n  /** Original error */\n  originalError?: Error;\n  /** Additional error details */\n  details?: Record<string, any>;\n\n  constructor(\n    message: string,\n    type: AuthErrorType = AuthErrorType.UNKNOWN,\n    statusCode?: number,\n    originalError?: Error,\n    details?: Record<string, any>\n  ) {\n    super(message);\n    this.name = 'AuthError';\n    this.type = type;\n    this.statusCode = statusCode;\n    this.originalError = originalError;\n    this.details = details;\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, AuthError);\n    }\n  }\n}\n\n/**\n * Token validation result\n */\nexport interface TokenValidationResult {\n  /** Whether the token is valid */\n  valid: boolean;\n  /** Token expiration timestamp */\n  expiresAt?: number;\n  /** Time until expiration in seconds */\n  expiresIn?: number;\n  /** Whether token is expired */\n  expired: boolean;\n  /** Whether token needs refresh soon */\n  needsRefresh: boolean;\n  /** Token claims/payload */\n  claims?: Record<string, any>;\n  /** Validation error if invalid */\n  error?: string;\n}\n\n/**\n * Authentication event types\n */\nexport enum AuthEventType {\n  /** Authentication started */\n  AUTH_STARTED = 'AUTH_STARTED',\n  /** Authentication succeeded */\n  AUTH_SUCCESS = 'AUTH_SUCCESS',\n  /** Authentication failed */\n  AUTH_FAILED = 'AUTH_FAILED',\n  /** Token refresh started */\n  REFRESH_STARTED = 'REFRESH_STARTED',\n  /** Token refresh succeeded */\n  REFRESH_SUCCESS = 'REFRESH_SUCCESS',\n  /** Token refresh failed */\n  REFRESH_FAILED = 'REFRESH_FAILED',\n  /** Session validated */\n  SESSION_VALIDATED = 'SESSION_VALIDATED',\n  /** Session expired */\n  SESSION_EXPIRED = 'SESSION_EXPIRED',\n  /** Logout initiated */\n  LOGOUT_STARTED = 'LOGOUT_STARTED',\n  /** Logout completed */\n  LOGOUT_COMPLETED = 'LOGOUT_COMPLETED',\n}\n\n/**\n * Authentication event\n */\nexport interface AuthEvent {\n  /** Event type */\n  type: AuthEventType;\n  /** Event timestamp */\n  timestamp: Date;\n  /** Session at time of event */\n  session?: AuthSession;\n  /** Error if event represents a failure */\n  error?: AuthError;\n  /** Additional event data */\n  data?: Record<string, any>;\n}\n\n/**\n * Authentication event listener\n */\nexport type AuthEventListener = (event: AuthEvent) => void;\n\n/**\n * Storage adapter interface for custom token storage\n */\nexport interface StorageAdapter {\n  /** Get item from storage */\n  getItem(key: string): Promise<string | null>;\n  /** Set item in storage */\n  setItem(key: string, value: string): Promise<void>;\n  /** Remove item from storage */\n  removeItem(key: string): Promise<void>;\n  /** Clear all items from storage */\n  clear(): Promise<void>;\n}\n\n/**\n * API response for authentication\n */\nexport interface AuthResponse {\n  /** Access token */\n  access_token: string;\n  /** Refresh token */\n  refresh_token?: string;\n  /** Token type */\n  token_type: string;\n  /** Expires in (seconds) */\n  expires_in: number;\n  /** Scopes granted */\n  scope?: string;\n  /** User information */\n  user?: UserInfo;\n  /** Additional response data */\n  [key: string]: any;\n}\n\n/**\n * API response for token refresh\n */\nexport interface RefreshResponse {\n  /** New access token */\n  access_token: string;\n  /** New refresh token (optional) */\n  refresh_token?: string;\n  /** Token type */\n  token_type: string;\n  /** Expires in (seconds) */\n  expires_in: number;\n  /** Additional response data */\n  [key: string]: any;\n}\n\n/**\n * API response for session validation\n */\nexport interface ValidationResponse {\n  /** Whether the session is valid */\n  valid: boolean;\n  /** Token expiration timestamp */\n  expires_at?: number;\n  /** User information */\n  user?: UserInfo;\n  /** Additional response data */\n  [key: string]: any;\n}\n","/**\n * AINative Authentication Provider\n * Provides seamless authentication integration with AINative's auth system\n */\n\nimport {\n  AuthError,\n  AuthErrorType,\n  AuthMethod,\n  AuthStatus,\n  AuthEventType,\n  StorageStrategy,\n} from './types';\nimport type {\n  AuthCredentials,\n  AuthConfig,\n  AuthSession,\n  TokenRefreshOptions,\n  TokenValidationResult,\n  AuthEventListener,\n  AuthEvent,\n  StorageAdapter,\n  AuthResponse,\n  RefreshResponse,\n  ValidationResponse,\n  APIKeyCredentials,\n  OAuthCredentials,\n  JWTCredentials,\n} from './types';\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<Omit<AuthConfig, 'customHeaders'>> = {\n  baseUrl: 'https://api.ainative.studio',\n  authEndpoint: '/v1/auth/authenticate',\n  refreshEndpoint: '/v1/auth/refresh',\n  validateEndpoint: '/v1/auth/validate',\n  logoutEndpoint: '/v1/auth/logout',\n  autoRefresh: true,\n  refreshBuffer: 300, // 5 minutes\n  timeout: 30000, // 30 seconds\n  maxRetries: 3,\n  retryDelay: 1000, // 1 second\n  enableLogging: false,\n  storageStrategy: StorageStrategy.MEMORY,\n};\n\n/**\n * AINative Authentication Provider\n * Handles authentication, token management, and session validation\n */\nexport class AINativeAuthProvider {\n  private config: Required<AuthConfig>;\n  private session: AuthSession;\n  private eventListeners: Map<AuthEventType, Set<AuthEventListener>>;\n  private refreshTimer?: NodeJS.Timeout;\n  private refreshPromise?: Promise<void>;\n  private storageAdapter?: StorageAdapter;\n  private customHeaders: Record<string, string>;\n\n  /**\n   * Create a new AINativeAuthProvider instance\n   * @param config - Authentication configuration\n   * @param storageAdapter - Custom storage adapter (required if using CUSTOM storage strategy)\n   */\n  constructor(config: AuthConfig = {}, storageAdapter?: StorageAdapter) {\n    this.config = {\n      ...DEFAULT_CONFIG,\n      ...config,\n      customHeaders: config.customHeaders || {},\n    };\n    this.customHeaders = config.customHeaders || {};\n    this.session = { status: AuthStatus.UNAUTHENTICATED };\n    this.eventListeners = new Map();\n    this.storageAdapter = storageAdapter;\n\n    if (this.config.storageStrategy === StorageStrategy.CUSTOM && !storageAdapter) {\n      throw new AuthError(\n        'Storage adapter is required when using CUSTOM storage strategy',\n        AuthErrorType.CONFIG_ERROR\n      );\n    }\n\n    this.log('AINativeAuthProvider initialized');\n  }\n\n  /**\n   * Authenticate with AINative\n   * @param credentials - Authentication credentials\n   * @returns Promise resolving to authentication session\n   */\n  async authenticate(credentials: AuthCredentials): Promise<AuthSession> {\n    this.log('Authentication started', { method: credentials.method });\n    this.updateStatus(AuthStatus.AUTHENTICATING);\n    this.emitEvent(AuthEventType.AUTH_STARTED, { credentials: { method: credentials.method } });\n\n    try {\n      const response = await this.makeAuthRequest(credentials);\n      const session = this.createSessionFromResponse(response, credentials.tenantId);\n\n      this.session = session;\n      await this.saveSession(session);\n\n      this.updateStatus(AuthStatus.AUTHENTICATED);\n      this.emitEvent(AuthEventType.AUTH_SUCCESS, { session });\n\n      // Set up auto-refresh if enabled\n      if (this.config.autoRefresh && session.expiresAt) {\n        this.scheduleTokenRefresh(session.expiresAt);\n      }\n\n      this.log('Authentication successful');\n      return session;\n    } catch (error) {\n      const authError = this.normalizeError(error);\n      this.updateStatus(AuthStatus.FAILED);\n      this.emitEvent(AuthEventType.AUTH_FAILED, { error: authError });\n      this.log('Authentication failed', { error: authError.message });\n      throw authError;\n    }\n  }\n\n  /**\n   * Refresh the current authentication token\n   * @param options - Token refresh options\n   * @returns Promise resolving to updated session\n   */\n  async refreshToken(options: TokenRefreshOptions = {}): Promise<AuthSession> {\n    // If refresh is already in progress, return the existing promise\n    if (this.refreshPromise) {\n      this.log('Token refresh already in progress, waiting...');\n      await this.refreshPromise;\n      return this.session;\n    }\n\n    const {\n      force = false,\n      retry = true,\n      maxRetries = this.config.maxRetries,\n    } = options;\n\n    // Check if refresh is needed\n    if (!force && this.session.status === AuthStatus.AUTHENTICATED) {\n      const validation = this.validateTokenLocally();\n      if (validation.valid && !validation.needsRefresh) {\n        this.log('Token is still valid, no refresh needed');\n        return this.session;\n      }\n    }\n\n    this.log('Token refresh started');\n    this.updateStatus(AuthStatus.REFRESHING);\n    this.emitEvent(AuthEventType.REFRESH_STARTED);\n\n    this.refreshPromise = this.performTokenRefresh(maxRetries, retry);\n\n    try {\n      await this.refreshPromise;\n      this.emitEvent(AuthEventType.REFRESH_SUCCESS, { session: this.session });\n      this.log('Token refresh successful');\n      return this.session;\n    } catch (error) {\n      const authError = this.normalizeError(error);\n      this.updateStatus(AuthStatus.EXPIRED);\n      this.emitEvent(AuthEventType.REFRESH_FAILED, { error: authError });\n      this.log('Token refresh failed', { error: authError.message });\n      throw authError;\n    } finally {\n      this.refreshPromise = undefined;\n    }\n  }\n\n  /**\n   * Validate the current session\n   * @returns Promise resolving to validation result\n   */\n  async validateSession(): Promise<TokenValidationResult> {\n    this.log('Session validation started');\n\n    // First check locally\n    const localValidation = this.validateTokenLocally();\n    if (!localValidation.valid) {\n      this.log('Session invalid (local check)');\n      return localValidation;\n    }\n\n    // Perform server-side validation\n    try {\n      const url = `${this.config.baseUrl}${this.config.validateEndpoint}`;\n      const response = await this.fetchWithRetry<ValidationResponse>(url, {\n        method: 'POST',\n        headers: this.getAuthHeaders(),\n      });\n\n      const result: TokenValidationResult = {\n        valid: response.valid,\n        expiresAt: response.expires_at,\n        expiresIn: response.expires_at\n          ? Math.max(0, response.expires_at - Math.floor(Date.now() / 1000))\n          : undefined,\n        expired: !response.valid,\n        needsRefresh: response.expires_at\n          ? response.expires_at - Math.floor(Date.now() / 1000) < this.config.refreshBuffer\n          : false,\n        claims: response.user as any,\n      };\n\n      this.emitEvent(AuthEventType.SESSION_VALIDATED, { validation: result });\n      this.log('Session validation completed', { valid: result.valid });\n\n      if (!result.valid) {\n        this.updateStatus(AuthStatus.EXPIRED);\n        this.emitEvent(AuthEventType.SESSION_EXPIRED);\n      }\n\n      return result;\n    } catch (error) {\n      const authError = this.normalizeError(error);\n      this.log('Session validation failed', { error: authError.message });\n\n      return {\n        valid: false,\n        expired: true,\n        needsRefresh: true,\n        error: authError.message,\n      };\n    }\n  }\n\n  /**\n   * Logout and clear the current session\n   * @returns Promise that resolves when logout is complete\n   */\n  async logout(): Promise<void> {\n    this.log('Logout started');\n    this.emitEvent(AuthEventType.LOGOUT_STARTED);\n\n    // Clear refresh timer\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n      this.refreshTimer = undefined;\n    }\n\n    // Call logout endpoint if authenticated\n    if (this.session.status === AuthStatus.AUTHENTICATED && this.session.accessToken) {\n      try {\n        const url = `${this.config.baseUrl}${this.config.logoutEndpoint}`;\n        await this.fetchWithRetry(url, {\n          method: 'POST',\n          headers: this.getAuthHeaders(),\n        });\n        this.log('Server logout successful');\n      } catch (error) {\n        // Log error but don't throw - we still want to clear local session\n        this.log('Server logout failed', { error: error instanceof Error ? error.message : 'Unknown error' });\n      }\n    }\n\n    // Clear session\n    this.session = { status: AuthStatus.UNAUTHENTICATED };\n    await this.clearSession();\n\n    this.emitEvent(AuthEventType.LOGOUT_COMPLETED);\n    this.log('Logout completed');\n  }\n\n  /**\n   * Get authentication headers for API calls\n   * @returns Headers object with authentication\n   */\n  getAuthHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...this.customHeaders,\n    };\n\n    if (this.session.accessToken) {\n      const tokenType = this.session.tokenType || 'Bearer';\n      headers['Authorization'] = `${tokenType} ${this.session.accessToken}`;\n    }\n\n    return headers;\n  }\n\n  /**\n   * Get the current authentication session\n   * @returns Current session\n   */\n  getSession(): AuthSession {\n    return { ...this.session };\n  }\n\n  /**\n   * Check if currently authenticated\n   * @returns True if authenticated\n   */\n  isAuthenticated(): boolean {\n    return this.session.status === AuthStatus.AUTHENTICATED && !!this.session.accessToken;\n  }\n\n  /**\n   * Get current configuration\n   * @returns Current configuration\n   */\n  getConfig(): AuthConfig {\n    return { ...this.config };\n  }\n\n  /**\n   * Update configuration\n   * @param config - Partial configuration to update\n   */\n  updateConfig(config: Partial<AuthConfig>): void {\n    this.config = { ...this.config, ...config };\n    if (config.customHeaders) {\n      this.customHeaders = { ...this.customHeaders, ...config.customHeaders };\n    }\n    this.log('Configuration updated');\n  }\n\n  /**\n   * Add event listener\n   * @param eventType - Event type to listen for\n   * @param listener - Event listener callback\n   */\n  addEventListener(eventType: AuthEventType, listener: AuthEventListener): void {\n    if (!this.eventListeners.has(eventType)) {\n      this.eventListeners.set(eventType, new Set());\n    }\n    this.eventListeners.get(eventType)!.add(listener);\n  }\n\n  /**\n   * Remove event listener\n   * @param eventType - Event type\n   * @param listener - Event listener callback\n   */\n  removeEventListener(eventType: AuthEventType, listener: AuthEventListener): void {\n    const listeners = this.eventListeners.get(eventType);\n    if (listeners) {\n      listeners.delete(listener);\n    }\n  }\n\n  /**\n   * Make authentication request based on credential type\n   * @private\n   */\n  private async makeAuthRequest(credentials: AuthCredentials): Promise<AuthResponse> {\n    const url = `${this.config.baseUrl}${this.config.authEndpoint}`;\n\n    let body: Record<string, any>;\n\n    switch (credentials.method) {\n      case AuthMethod.API_KEY:\n        body = {\n          grant_type: 'api_key',\n          api_key: (credentials as APIKeyCredentials).apiKey,\n          tenant_id: credentials.tenantId,\n        };\n        break;\n\n      case AuthMethod.OAUTH:\n        const oauthCreds = credentials as OAuthCredentials;\n        body = {\n          grant_type: 'client_credentials',\n          client_id: oauthCreds.clientId,\n          client_secret: oauthCreds.clientSecret,\n          scope: oauthCreds.scopes?.join(' '),\n          redirect_uri: oauthCreds.redirectUri,\n          tenant_id: credentials.tenantId,\n        };\n        break;\n\n      case AuthMethod.JWT:\n        const jwtCreds = credentials as JWTCredentials;\n        body = {\n          grant_type: 'jwt_bearer',\n          assertion: jwtCreds.token,\n          refresh_token: jwtCreds.refreshToken,\n          tenant_id: credentials.tenantId,\n        };\n        break;\n\n      default:\n        throw new AuthError(\n          `Unsupported authentication method: ${(credentials as any).method}`,\n          AuthErrorType.CONFIG_ERROR\n        );\n    }\n\n    return this.fetchWithRetry<AuthResponse>(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...this.customHeaders,\n      },\n      body: JSON.stringify(body),\n    });\n  }\n\n  /**\n   * Perform token refresh\n   * @private\n   */\n  private async performTokenRefresh(maxRetries: number, retry: boolean): Promise<void> {\n    if (!this.session.refreshToken) {\n      throw new AuthError(\n        'No refresh token available',\n        AuthErrorType.INVALID_TOKEN\n      );\n    }\n\n    const url = `${this.config.baseUrl}${this.config.refreshEndpoint}`;\n    const response = await this.fetchWithRetry<RefreshResponse>(\n      url,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...this.customHeaders,\n        },\n        body: JSON.stringify({\n          refresh_token: this.session.refreshToken,\n          tenant_id: this.session.tenantId,\n        }),\n      },\n      retry ? maxRetries : 1\n    );\n\n    // Update session with new tokens\n    const now = Math.floor(Date.now() / 1000);\n    this.session = {\n      ...this.session,\n      status: AuthStatus.AUTHENTICATED,\n      accessToken: response.access_token,\n      refreshToken: response.refresh_token || this.session.refreshToken,\n      tokenType: response.token_type,\n      expiresAt: now + response.expires_in,\n      issuedAt: now,\n    };\n\n    await this.saveSession(this.session);\n\n    // Schedule next refresh\n    if (this.config.autoRefresh && this.session.expiresAt) {\n      this.scheduleTokenRefresh(this.session.expiresAt);\n    }\n  }\n\n  /**\n   * Create session from authentication response\n   * @private\n   */\n  private createSessionFromResponse(response: AuthResponse, tenantId?: string): AuthSession {\n    const now = Math.floor(Date.now() / 1000);\n\n    return {\n      status: AuthStatus.AUTHENTICATED,\n      accessToken: response.access_token,\n      refreshToken: response.refresh_token,\n      tokenType: response.token_type,\n      expiresAt: now + response.expires_in,\n      issuedAt: now,\n      scopes: response.scope?.split(' '),\n      user: response.user,\n      tenantId,\n      metadata: {},\n    };\n  }\n\n  /**\n   * Validate token locally without server call\n   * @private\n   */\n  private validateTokenLocally(): TokenValidationResult {\n    if (!this.session.accessToken || !this.session.expiresAt) {\n      return {\n        valid: false,\n        expired: true,\n        needsRefresh: true,\n        error: 'No active session',\n      };\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    const expiresIn = this.session.expiresAt - now;\n    const expired = expiresIn <= 0;\n    const needsRefresh = expiresIn < this.config.refreshBuffer;\n\n    return {\n      valid: !expired,\n      expiresAt: this.session.expiresAt,\n      expiresIn: Math.max(0, expiresIn),\n      expired,\n      needsRefresh,\n    };\n  }\n\n  /**\n   * Schedule automatic token refresh\n   * @private\n   */\n  private scheduleTokenRefresh(expiresAt: number): void {\n    // Clear existing timer\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    const timeUntilRefresh = (expiresAt - now - this.config.refreshBuffer) * 1000;\n\n    if (timeUntilRefresh > 0) {\n      this.log(`Token refresh scheduled in ${timeUntilRefresh}ms`);\n      this.refreshTimer = setTimeout(() => {\n        this.refreshToken({ force: true, retry: true }).catch((error) => {\n          this.log('Auto-refresh failed', { error: error.message });\n        });\n      }, timeUntilRefresh);\n    }\n  }\n\n  /**\n   * Make HTTP request with retry logic\n   * @private\n   */\n  private async fetchWithRetry<T>(\n    url: string,\n    options: RequestInit,\n    maxRetries: number = this.config.maxRetries\n  ): Promise<T> {\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= maxRetries; attempt++) {\n      try {\n        const controller = new AbortController();\n        const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n        const response = await fetch(url, {\n          ...options,\n          signal: controller.signal,\n        });\n\n        clearTimeout(timeoutId);\n\n        if (!response.ok) {\n          throw await this.createErrorFromResponse(response);\n        }\n\n        const data = await response.json();\n        return data as T;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        // Don't retry on certain errors\n        if (\n          error instanceof AuthError &&\n          (error.type === AuthErrorType.INVALID_CREDENTIALS ||\n            error.type === AuthErrorType.UNAUTHORIZED ||\n            error.type === AuthErrorType.FORBIDDEN ||\n            error.type === AuthErrorType.RATE_LIMIT_EXCEEDED ||\n            error.type === AuthErrorType.SERVER_ERROR)\n        ) {\n          throw error;\n        }\n\n        // Retry on network errors\n        if (attempt < maxRetries) {\n          this.log(`Request failed, retrying (${attempt + 1}/${maxRetries})`, {\n            error: lastError.message,\n          });\n          await this.sleep(this.config.retryDelay * (attempt + 1));\n          continue;\n        }\n      }\n    }\n\n    throw new AuthError(\n      `Request failed after ${maxRetries} retries: ${lastError?.message}`,\n      AuthErrorType.NETWORK_ERROR,\n      undefined,\n      lastError\n    );\n  }\n\n  /**\n   * Create AuthError from HTTP response\n   * @private\n   */\n  private async createErrorFromResponse(response: Response): Promise<AuthError> {\n    let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n    let errorType = AuthErrorType.UNKNOWN;\n    let details: Record<string, any> = {};\n\n    try {\n      const errorData = await response.json();\n      errorMessage = errorData.message || errorData.error || errorMessage;\n      details = errorData;\n    } catch {\n      // Response body is not JSON\n    }\n\n    // Map HTTP status codes to error types\n    switch (response.status) {\n      case 401:\n        errorType = AuthErrorType.UNAUTHORIZED;\n        break;\n      case 403:\n        errorType = AuthErrorType.FORBIDDEN;\n        break;\n      case 429:\n        errorType = AuthErrorType.RATE_LIMIT_EXCEEDED;\n        break;\n      case 500:\n      case 502:\n      case 503:\n      case 504:\n        errorType = AuthErrorType.SERVER_ERROR;\n        break;\n    }\n\n    return new AuthError(errorMessage, errorType, response.status, undefined, details);\n  }\n\n  /**\n   * Normalize error to AuthError\n   * @private\n   */\n  private normalizeError(error: unknown): AuthError {\n    if (error instanceof AuthError) {\n      return error;\n    }\n\n    if (error instanceof Error) {\n      return new AuthError(\n        error.message,\n        AuthErrorType.UNKNOWN,\n        undefined,\n        error\n      );\n    }\n\n    return new AuthError(\n      String(error),\n      AuthErrorType.UNKNOWN\n    );\n  }\n\n  /**\n   * Update session status\n   * @private\n   */\n  private updateStatus(status: AuthStatus): void {\n    this.session.status = status;\n  }\n\n  /**\n   * Emit event to listeners\n   * @private\n   */\n  private emitEvent(eventType: AuthEventType, data?: Record<string, any>): void {\n    const event: AuthEvent = {\n      type: eventType,\n      timestamp: new Date(),\n      session: { ...this.session },\n      ...data,\n    };\n\n    const listeners = this.eventListeners.get(eventType);\n    if (listeners) {\n      listeners.forEach((listener) => {\n        try {\n          listener(event);\n        } catch (error) {\n          this.log('Error in event listener', { error: error instanceof Error ? error.message : 'Unknown' });\n        }\n      });\n    }\n  }\n\n  /**\n   * Save session to storage\n   * @private\n   */\n  private async saveSession(session: AuthSession): Promise<void> {\n    try {\n      const sessionData = JSON.stringify(session);\n\n      switch (this.config.storageStrategy) {\n        case StorageStrategy.MEMORY:\n          // Already in memory\n          break;\n\n        case StorageStrategy.LOCAL_STORAGE:\n          if (typeof localStorage !== 'undefined') {\n            localStorage.setItem('ainative_auth_session', sessionData);\n          }\n          break;\n\n        case StorageStrategy.SESSION_STORAGE:\n          if (typeof sessionStorage !== 'undefined') {\n            sessionStorage.setItem('ainative_auth_session', sessionData);\n          }\n          break;\n\n        case StorageStrategy.CUSTOM:\n          if (this.storageAdapter) {\n            await this.storageAdapter.setItem('ainative_auth_session', sessionData);\n          }\n          break;\n      }\n    } catch (error) {\n      this.log('Failed to save session', { error: error instanceof Error ? error.message : 'Unknown' });\n    }\n  }\n\n  /**\n   * Clear session from storage\n   * @private\n   */\n  private async clearSession(): Promise<void> {\n    try {\n      switch (this.config.storageStrategy) {\n        case StorageStrategy.MEMORY:\n          // Already cleared\n          break;\n\n        case StorageStrategy.LOCAL_STORAGE:\n          if (typeof localStorage !== 'undefined') {\n            localStorage.removeItem('ainative_auth_session');\n          }\n          break;\n\n        case StorageStrategy.SESSION_STORAGE:\n          if (typeof sessionStorage !== 'undefined') {\n            sessionStorage.removeItem('ainative_auth_session');\n          }\n          break;\n\n        case StorageStrategy.CUSTOM:\n          if (this.storageAdapter) {\n            await this.storageAdapter.removeItem('ainative_auth_session');\n          }\n          break;\n      }\n    } catch (error) {\n      this.log('Failed to clear session', { error: error instanceof Error ? error.message : 'Unknown' });\n    }\n  }\n\n  /**\n   * Log message if logging is enabled\n   * @private\n   */\n  private log(message: string, data?: Record<string, any>): void {\n    if (this.config.enableLogging) {\n      console.log(`[AINativeAuth] ${message}`, data || '');\n    }\n  }\n\n  /**\n   * Sleep for specified milliseconds\n   * @private\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","/**\n * ZeroDB Storage Backend\n *\n * Storage backend implementation using ZeroDB for RLHF logging\n */\n\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n} from '../types';\n\nexport interface ZeroDBConfig {\n  projectId: string;\n  apiKey?: string;\n  tableName?: string;\n  vectorTableName?: string;\n}\n\n/**\n * ZeroDB storage backend implementation\n */\nexport class ZeroDBStorage implements IStorageBackend {\n  private config: ZeroDBConfig;\n  private initialized = false;\n\n  constructor(config: ZeroDBConfig) {\n    this.config = {\n      tableName: 'rlhf_feedback',\n      vectorTableName: 'rlhf_vectors',\n      ...config,\n    };\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    // Initialize ZeroDB connection and create tables if needed\n    // In production, this would use the ZeroDB MCP server or SDK\n    // The config will be used to connect: await zerodb.connect(this.config)\n    void this.config; // Suppress unused warning - will be used in production\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    // Store interaction in ZeroDB table\n    // Use ZeroDB table insert command\n    const record = {\n      id: interaction.id,\n      type: 'interaction',\n      data: JSON.stringify(interaction),\n      timestamp: interaction.timestamp.toISOString(),\n      user_id: interaction.userId,\n      session_id: interaction.sessionId,\n    };\n\n    // In production: await zerodb.table.insert(this.config.tableName, record)\n    void record; // Suppress unused warning - used in production\n    void record; // Suppress unused warning - used in production\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    // Store feedback in ZeroDB table\n    const record = {\n      id: feedback.id,\n      type: 'feedback',\n      interaction_id: feedback.interactionId,\n      feedback_type: feedback.type,\n      data: JSON.stringify(feedback),\n      timestamp: feedback.timestamp.toISOString(),\n      user_id: feedback.userId,\n      session_id: feedback.sessionId,\n    };\n\n    // In production: await zerodb.table.insert(this.config.tableName, record)\n    void record; // Suppress unused warning - used in production\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    const records = interactions.map(interaction => ({\n      id: interaction.id,\n      type: 'interaction',\n      data: JSON.stringify(interaction),\n      timestamp: interaction.timestamp.toISOString(),\n      user_id: interaction.userId,\n      session_id: interaction.sessionId,\n    }));\n\n    // In production: await zerodb.table.insertBatch(this.config.tableName, records)\n    void records; // Suppress unused warning - used in production\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    const records = feedback.map(f => ({\n      id: f.id,\n      type: 'feedback',\n      interaction_id: f.interactionId,\n      feedback_type: f.type,\n      data: JSON.stringify(f),\n      timestamp: f.timestamp.toISOString(),\n      user_id: f.userId,\n      session_id: f.sessionId,\n    }));\n\n    // In production: await zerodb.table.insertBatch(this.config.tableName, records)\n    void records; // Suppress unused warning - used in production\n  }\n\n  async getInteraction(_id: string): Promise<InteractionLog | null> {\n    // Query ZeroDB for interaction by ID\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { id, type: 'interaction' }\n    // })\n    // return results.length > 0 ? JSON.parse(results[0].data) : null\n\n    return null;\n  }\n\n  async getFeedback(_id: string): Promise<Feedback | null> {\n    // Query ZeroDB for feedback by ID\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { id, type: 'feedback' }\n    // })\n    // return results.length > 0 ? JSON.parse(results[0].data) : null\n\n    return null;\n  }\n\n  async getFeedbackForInteraction(_interactionId: string): Promise<Feedback[]> {\n    // Query ZeroDB for all feedback for an interaction\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { interaction_id: interactionId, type: 'feedback' }\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async getInteractions(_startTime: Date, _endTime: Date, _limit?: number): Promise<InteractionLog[]> {\n    // Query ZeroDB for interactions in time range\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: {\n    //     type: 'interaction',\n    //     timestamp: { gte: startTime.toISOString(), lte: endTime.toISOString() }\n    //   },\n    //   limit\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async getFeedbackInRange(_startTime: Date, _endTime: Date, _limit?: number): Promise<Feedback[]> {\n    // Query ZeroDB for feedback in time range\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: {\n    //     type: 'feedback',\n    //     timestamp: { gte: startTime.toISOString(), lte: endTime.toISOString() }\n    //   },\n    //   limit\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    // Get all feedback and interactions in range\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Close ZeroDB connection\n    this.initialized = false;\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = ratings.sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * Local File Storage Backend\n *\n * Storage backend implementation using local filesystem for RLHF logging\n */\n\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { createWriteStream, createReadStream } from 'fs';\nimport { createGzip } from 'zlib';\nimport { pipeline } from 'stream/promises';\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n} from '../types';\n\nexport interface LocalStorageConfig {\n  dataDir: string;\n  compress?: boolean;\n  maxFileSize?: number; // in MB\n  rotateFiles?: boolean;\n}\n\n/**\n * Local file storage backend implementation\n */\nexport class LocalStorage implements IStorageBackend {\n  private config: LocalStorageConfig;\n  private interactionsFile: string;\n  private feedbackFile: string;\n  private initialized = false;\n  private currentFileSize = 0;\n  private fileRotationIndex = 0;\n\n  constructor(config: LocalStorageConfig) {\n    this.config = {\n      compress: false,\n      maxFileSize: 100, // 100 MB\n      rotateFiles: true,\n      ...config,\n    };\n\n    this.interactionsFile = path.join(this.config.dataDir, 'interactions.jsonl');\n    this.feedbackFile = path.join(this.config.dataDir, 'feedback.jsonl');\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    // Create data directory if it doesn't exist\n    await fs.mkdir(this.config.dataDir, { recursive: true });\n\n    // Check current file sizes\n    try {\n      const stats = await fs.stat(this.interactionsFile);\n      this.currentFileSize = stats.size / (1024 * 1024); // Convert to MB\n    } catch (err) {\n      // File doesn't exist yet\n      this.currentFileSize = 0;\n    }\n\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    const line = JSON.stringify(interaction) + '\\n';\n    await this.appendToFile(this.interactionsFile, line);\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    const line = JSON.stringify(feedback) + '\\n';\n    await this.appendToFile(this.feedbackFile, line);\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    const lines = interactions.map(i => JSON.stringify(i) + '\\n').join('');\n    await this.appendToFile(this.interactionsFile, lines);\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    const lines = feedback.map(f => JSON.stringify(f) + '\\n').join('');\n    await this.appendToFile(this.feedbackFile, lines);\n  }\n\n  async getInteraction(id: string): Promise<InteractionLog | null> {\n    const interactions = await this.readFile<InteractionLog>(this.interactionsFile);\n    return interactions.find(i => i.id === id) || null;\n  }\n\n  async getFeedback(id: string): Promise<Feedback | null> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n    return feedback.find(f => f.id === id) || null;\n  }\n\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n    return feedback.filter(f => f.interactionId === interactionId);\n  }\n\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    const interactions = await this.readFile<InteractionLog>(this.interactionsFile);\n\n    let filtered = interactions.filter(i => {\n      const timestamp = new Date(i.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n\n    let filtered = feedback.filter(f => {\n      const timestamp = new Date(f.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Compress files if enabled\n    if (this.config.compress) {\n      await this.compressFile(this.interactionsFile);\n      await this.compressFile(this.feedbackFile);\n    }\n\n    this.initialized = false;\n  }\n\n  /**\n   * Append data to file\n   */\n  private async appendToFile(filePath: string, data: string): Promise<void> {\n    // Check if file rotation is needed\n    if (this.config.rotateFiles && this.currentFileSize >= (this.config.maxFileSize || 100)) {\n      await this.rotateFile(filePath);\n    }\n\n    await fs.appendFile(filePath, data, 'utf8');\n    this.currentFileSize += data.length / (1024 * 1024);\n  }\n\n  /**\n   * Read file and parse JSONL\n   */\n  private async readFile<T>(filePath: string): Promise<T[]> {\n    try {\n      const content = await fs.readFile(filePath, 'utf8');\n      const lines = content.trim().split('\\n').filter(line => line.length > 0);\n      return lines.map(line => {\n        const parsed = JSON.parse(line);\n        // Convert timestamp strings back to Date objects\n        if (parsed.timestamp) {\n          parsed.timestamp = new Date(parsed.timestamp);\n        }\n        if (parsed.data && parsed.data.timestamp) {\n          parsed.data.timestamp = new Date(parsed.data.timestamp);\n        }\n        return parsed;\n      });\n    } catch (err: any) {\n      if (err.code === 'ENOENT') {\n        return [];\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Rotate file when max size reached\n   */\n  private async rotateFile(filePath: string): Promise<void> {\n    this.fileRotationIndex++;\n    const ext = path.extname(filePath);\n    const base = filePath.slice(0, -ext.length);\n    const newPath = `${base}.${this.fileRotationIndex}${ext}`;\n\n    try {\n      await fs.rename(filePath, newPath);\n      this.currentFileSize = 0;\n\n      // Compress rotated file if enabled\n      if (this.config.compress) {\n        await this.compressFile(newPath);\n      }\n    } catch (err: any) {\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * Compress file using gzip\n   */\n  private async compressFile(filePath: string): Promise<void> {\n    try {\n      const source = createReadStream(filePath);\n      const destination = createWriteStream(`${filePath}.gz`);\n      const gzip = createGzip();\n\n      await pipeline(source, gzip, destination);\n\n      // Delete original file after compression\n      await fs.unlink(filePath);\n    } catch (err: any) {\n      if (err.code !== 'ENOENT') {\n        console.error('Error compressing file:', err);\n      }\n    }\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = ratings.sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Multi-dimensional feedback stats\n    const multiDimFeedback = feedback.filter(f => f.type === FeedbackType.MULTI_DIMENSIONAL);\n    if (multiDimFeedback.length > 0) {\n      const dimensionSums: { [key: string]: number } = {};\n      const dimensionCounts: { [key: string]: number } = {};\n\n      multiDimFeedback.forEach(f => {\n        const data = f.data as any;\n        Object.entries(data.dimensions).forEach(([dim, value]) => {\n          dimensionSums[dim] = (dimensionSums[dim] || 0) + (value as number);\n          dimensionCounts[dim] = (dimensionCounts[dim] || 0) + 1;\n        });\n      });\n\n      const dimensionAverages: { [key: string]: number } = {};\n      Object.keys(dimensionSums).forEach(dim => {\n        const sum = dimensionSums[dim];\n        const count = dimensionCounts[dim];\n        if (sum !== undefined && count !== undefined && count > 0) {\n          dimensionAverages[dim] = sum / count;\n        }\n      });\n\n      stats.multiDimensional = {\n        count: multiDimFeedback.length,\n        dimensionAverages,\n      };\n    }\n\n    // Comparative feedback stats\n    const comparativeFeedback = feedback.filter(f => f.type === FeedbackType.COMPARATIVE);\n    if (comparativeFeedback.length > 0) {\n      const confidenceLevels = comparativeFeedback\n        .map(f => (f.data as any).confidenceLevel)\n        .filter((c): c is number => c !== undefined);\n\n      stats.comparative = {\n        count: comparativeFeedback.length,\n        averageConfidence:\n          confidenceLevels.length > 0\n            ? confidenceLevels.reduce((a, b) => a + b, 0) / confidenceLevels.length\n            : undefined,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * Memory Storage Backend\n *\n * In-memory storage backend for RLHF logging (primarily for testing)\n */\n\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n  MultiDimensionalFeedbackData,\n  ComparativeFeedbackData,\n} from '../types';\n\nexport interface MemoryStorageConfig {\n  maxEntries?: number;\n}\n\n/**\n * In-memory storage backend implementation\n */\nexport class MemoryStorage implements IStorageBackend {\n  private config: MemoryStorageConfig;\n  private interactions: Map<string, InteractionLog> = new Map();\n  private feedback: Map<string, Feedback> = new Map();\n  private interactionsByTime: InteractionLog[] = [];\n  private feedbackByTime: Feedback[] = [];\n  private initialized = false;\n\n  constructor(config: MemoryStorageConfig = {}) {\n    this.config = {\n      maxEntries: 10000,\n      ...config,\n    };\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    this.interactions.set(interaction.id, interaction);\n    this.interactionsByTime.push(interaction);\n\n    // Enforce max entries limit\n    if (this.interactionsByTime.length > (this.config.maxEntries || 10000)) {\n      const removed = this.interactionsByTime.shift();\n      if (removed) {\n        this.interactions.delete(removed.id);\n      }\n    }\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    this.feedback.set(feedback.id, feedback);\n    this.feedbackByTime.push(feedback);\n\n    // Enforce max entries limit\n    if (this.feedbackByTime.length > (this.config.maxEntries || 10000)) {\n      const removed = this.feedbackByTime.shift();\n      if (removed) {\n        this.feedback.delete(removed.id);\n      }\n    }\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    for (const interaction of interactions) {\n      await this.storeInteraction(interaction);\n    }\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    for (const f of feedback) {\n      await this.storeFeedback(f);\n    }\n  }\n\n  async getInteraction(id: string): Promise<InteractionLog | null> {\n    return this.interactions.get(id) || null;\n  }\n\n  async getFeedback(id: string): Promise<Feedback | null> {\n    return this.feedback.get(id) || null;\n  }\n\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    return this.feedbackByTime.filter(f => f.interactionId === interactionId);\n  }\n\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    let filtered = this.interactionsByTime.filter(i => {\n      const timestamp = new Date(i.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    let filtered = this.feedbackByTime.filter(f => {\n      const timestamp = new Date(f.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Clean up memory\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n    this.initialized = false;\n  }\n\n  /**\n   * Get all interactions (for testing)\n   */\n  getAllInteractions(): InteractionLog[] {\n    return [...this.interactionsByTime];\n  }\n\n  /**\n   * Get all feedback (for testing)\n   */\n  getAllFeedback(): Feedback[] {\n    return [...this.feedbackByTime];\n  }\n\n  /**\n   * Clear all data (for testing)\n   */\n  clear(): void {\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = [...ratings].sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Multi-dimensional feedback stats\n    const multiDimFeedback = feedback.filter(f => f.type === FeedbackType.MULTI_DIMENSIONAL);\n    if (multiDimFeedback.length > 0) {\n      const dimensionSums: { [key: string]: number } = {};\n      const dimensionCounts: { [key: string]: number } = {};\n\n      multiDimFeedback.forEach(f => {\n        const data = f.data as MultiDimensionalFeedbackData;\n        Object.entries(data.dimensions).forEach(([dim, value]) => {\n          dimensionSums[dim] = (dimensionSums[dim] || 0) + value;\n          dimensionCounts[dim] = (dimensionCounts[dim] || 0) + 1;\n        });\n      });\n\n      const dimensionAverages: { [key: string]: number } = {};\n      Object.keys(dimensionSums).forEach(dim => {\n        const sum = dimensionSums[dim];\n        const count = dimensionCounts[dim];\n        if (sum !== undefined && count !== undefined && count > 0) {\n          dimensionAverages[dim] = sum / count;\n        }\n      });\n\n      stats.multiDimensional = {\n        count: multiDimFeedback.length,\n        dimensionAverages,\n      };\n    }\n\n    // Comparative feedback stats\n    const comparativeFeedback = feedback.filter(f => f.type === FeedbackType.COMPARATIVE);\n    if (comparativeFeedback.length > 0) {\n      const confidenceLevels = comparativeFeedback\n        .map(f => (f.data as ComparativeFeedbackData).confidenceLevel)\n        .filter((c): c is number => c !== undefined);\n\n      stats.comparative = {\n        count: comparativeFeedback.length,\n        averageConfidence:\n          confidenceLevels.length > 0\n            ? confidenceLevels.reduce((a, b) => a + b, 0) / confidenceLevels.length\n            : undefined,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * RLHFLogger - Reinforcement Learning from Human Feedback Logger\n *\n * Comprehensive logging system for capturing user feedback and AI interactions\n * to improve model performance through RLHF.\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n  RLHFConfig,\n  InteractionLog,\n  Feedback,\n  FeedbackType,\n  FeedbackData,\n  BinaryFeedback,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  MultiDimensionalFeedbackData,\n  ComparativeFeedbackData,\n  FeedbackStats,\n  IStorageBackend,\n  StorageBackend,\n  ExportFormat,\n  ExportOptions,\n  FeedbackFilter,\n  BatchOperation,\n  FeedbackSession,\n  AnalyticsResult,\n} from './types';\nimport { ZeroDBStorage } from './storage/ZeroDBStorage';\nimport { LocalStorage } from './storage/LocalStorage';\nimport { MemoryStorage } from './storage/MemoryStorage';\n\n/**\n * Main RLHF Logger class\n */\nexport class RLHFLogger {\n  private config: RLHFConfig;\n  private storage: IStorageBackend;\n  private batchQueue: BatchOperation[] = [];\n  private batchTimer?: NodeJS.Timeout;\n  private currentSession?: FeedbackSession;\n  private sessionTimer?: NodeJS.Timeout;\n  private initialized = false;\n\n  /**\n   * Create a new RLHFLogger instance\n   */\n  constructor(config: RLHFConfig) {\n    this.config = this.normalizeConfig(config);\n    this.storage = this.createStorageBackend();\n  }\n\n  /**\n   * Normalize configuration with defaults\n   */\n  private normalizeConfig(config: RLHFConfig): RLHFConfig {\n    return {\n      backend: config.backend || StorageBackend.MEMORY,\n      backendConfig: config.backendConfig || {},\n      enableBatching: config.enableBatching ?? true,\n      batchSize: config.batchSize || 50,\n      batchFlushInterval: config.batchFlushInterval || 5000,\n      enableCompression: config.enableCompression ?? false,\n      autoGenerateIds: config.autoGenerateIds ?? true,\n      enableSessionTracking: config.enableSessionTracking ?? true,\n      sessionTimeout: config.sessionTimeout || 1800000, // 30 minutes\n      allowAnonymous: config.allowAnonymous ?? true,\n      defaultMetadata: config.defaultMetadata || {},\n      debug: config.debug ?? false,\n    };\n  }\n\n  /**\n   * Create storage backend based on configuration\n   */\n  private createStorageBackend(): IStorageBackend {\n    switch (this.config.backend) {\n      case StorageBackend.ZERODB:\n        if (!this.config.backendConfig?.zerodb) {\n          throw new Error('ZeroDB backend config is required when using ZERODB storage');\n        }\n        return new ZeroDBStorage(this.config.backendConfig.zerodb);\n\n      case StorageBackend.LOCAL:\n        if (!this.config.backendConfig?.local) {\n          throw new Error('Local backend config is required when using LOCAL storage');\n        }\n        return new LocalStorage(this.config.backendConfig.local);\n\n      case StorageBackend.MEMORY:\n        return new MemoryStorage(this.config.backendConfig?.memory || {});\n\n      case StorageBackend.CUSTOM:\n        if (!this.config.backendConfig?.custom?.implementation) {\n          throw new Error('Custom storage backend implementation required');\n        }\n        return this.config.backendConfig.custom.implementation;\n\n      default:\n        throw new Error(`Unsupported storage backend: ${this.config.backend}`);\n    }\n  }\n\n  /**\n   * Initialize the logger\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    await this.storage.initialize();\n\n    if (this.config.enableBatching) {\n      this.startBatchTimer();\n    }\n\n    if (this.config.enableSessionTracking) {\n      this.startSession();\n    }\n\n    this.initialized = true;\n    this.log('RLHFLogger initialized');\n  }\n\n  /**\n   * Log an AI interaction\n   */\n  async logInteraction(\n    prompt: string,\n    response: string,\n    metadata?: {\n      model?: string;\n      modelParams?: Record<string, any>;\n      latency?: number;\n      tokenUsage?: { prompt: number; completion: number; total: number };\n      userId?: string;\n      sessionId?: string;\n      context?: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const interactionId = this.config.autoGenerateIds ? randomUUID() : metadata?.['id'];\n\n    if (!interactionId) {\n      throw new Error('Interaction ID required when autoGenerateIds is disabled');\n    }\n\n    const interaction: InteractionLog = {\n      id: interactionId,\n      prompt,\n      response,\n      model: metadata?.model,\n      modelParams: metadata?.modelParams,\n      latency: metadata?.latency,\n      tokenUsage: metadata?.tokenUsage,\n      userId: metadata?.userId,\n      sessionId: metadata?.sessionId || this.currentSession?.id,\n      context: metadata?.context,\n      metadata: {\n        ...this.config.defaultMetadata,\n        ...metadata,\n      },\n      timestamp: new Date(),\n      feedbackIds: [],\n    };\n\n    if (this.config.enableBatching) {\n      this.addToBatch('interaction', interaction);\n    } else {\n      await this.storage.storeInteraction(interaction);\n    }\n\n    // Add to current session\n    if (this.currentSession) {\n      this.currentSession.interactionIds.push(interactionId);\n      this.resetSessionTimer();\n    }\n\n    this.log('Logged interaction:', interactionId);\n    return interactionId;\n  }\n\n  /**\n   * Log binary feedback (thumbs up/down)\n   */\n  async logBinaryFeedback(\n    interactionId: string,\n    value: BinaryFeedback,\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: BinaryFeedbackData = {\n      value,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.BINARY, data, metadata);\n  }\n\n  /**\n   * Log rating feedback (1-5 stars)\n   */\n  async logRating(\n    interactionId: string,\n    rating: number,\n    comment?: string,\n    metadata?: {\n      maxRating?: number;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const maxRating = metadata?.maxRating || 5;\n\n    if (rating < 1 || rating > maxRating) {\n      throw new Error(`Rating must be between 1 and ${maxRating}`);\n    }\n\n    const data: RatingFeedbackData = {\n      rating,\n      maxRating,\n      comment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.RATING, data, metadata);\n  }\n\n  /**\n   * Log text feedback (comments)\n   */\n  async logTextFeedback(\n    interactionId: string,\n    comment: string,\n    sentiment?: 'positive' | 'negative' | 'neutral',\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: TextFeedbackData = {\n      comment,\n      sentiment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.TEXT, data, metadata);\n  }\n\n  /**\n   * Log multi-dimensional feedback\n   */\n  async logMultiDimensionalFeedback(\n    interactionId: string,\n    dimensions: { [dimensionName: string]: number },\n    options?: {\n      weights?: { [dimensionName: string]: number };\n      overallComment?: string;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: MultiDimensionalFeedbackData = {\n      dimensions,\n      weights: options?.weights,\n      overallComment: options?.overallComment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.MULTI_DIMENSIONAL, data, options);\n  }\n\n  /**\n   * Log comparative feedback\n   */\n  async logComparativeFeedback(\n    preferredResponseId: string,\n    comparedResponseIds: string[],\n    options?: {\n      reason?: string;\n      confidenceLevel?: number;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    if (options?.confidenceLevel !== undefined &&\n        (options.confidenceLevel < 0 || options.confidenceLevel > 1)) {\n      throw new Error('Confidence level must be between 0 and 1');\n    }\n\n    const data: ComparativeFeedbackData = {\n      preferredResponseId,\n      comparedResponseIds,\n      reason: options?.reason,\n      confidenceLevel: options?.confidenceLevel,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(preferredResponseId, FeedbackType.COMPARATIVE, data, options);\n  }\n\n  /**\n   * Generic feedback logging method\n   */\n  async logFeedback(\n    interactionId: string,\n    type: FeedbackType,\n    data: FeedbackData,\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const feedbackId = this.config.autoGenerateIds ? randomUUID() : metadata?.['id'];\n\n    if (!feedbackId) {\n      throw new Error('Feedback ID required when autoGenerateIds is disabled');\n    }\n\n    const feedback: Feedback = {\n      id: feedbackId,\n      interactionId,\n      type,\n      data,\n      userId: metadata?.userId,\n      sessionId: metadata?.sessionId || this.currentSession?.id,\n      source: metadata?.source,\n      metadata: {\n        ...this.config.defaultMetadata,\n        ...metadata,\n      },\n      timestamp: new Date(),\n    };\n\n    if (this.config.enableBatching) {\n      this.addToBatch('feedback', feedback);\n    } else {\n      await this.storage.storeFeedback(feedback);\n    }\n\n    // Add to current session\n    if (this.currentSession) {\n      this.currentSession.feedbackIds.push(feedbackId);\n      this.resetSessionTimer();\n    }\n\n    this.log('Logged feedback:', feedbackId);\n    return feedbackId;\n  }\n\n  /**\n   * Get feedback statistics\n   */\n  async getFeedbackStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    return this.storage.calculateStats(startTime, endTime);\n  }\n\n  /**\n   * Get interaction by ID\n   */\n  async getInteraction(interactionId: string): Promise<InteractionLog | null> {\n    return this.storage.getInteraction(interactionId);\n  }\n\n  /**\n   * Get feedback by ID\n   */\n  async getFeedback(feedbackId: string): Promise<Feedback | null> {\n    return this.storage.getFeedback(feedbackId);\n  }\n\n  /**\n   * Get all feedback for an interaction\n   */\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    return this.storage.getFeedbackForInteraction(interactionId);\n  }\n\n  /**\n   * Get interactions in time range\n   */\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    return this.storage.getInteractions(startTime, endTime, limit);\n  }\n\n  /**\n   * Get feedback in time range\n   */\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    return this.storage.getFeedbackInRange(startTime, endTime, limit);\n  }\n\n  /**\n   * Export feedback data\n   */\n  async exportFeedback(\n    format: ExportFormat,\n    options?: Omit<ExportOptions, 'format'>\n  ): Promise<string | Buffer> {\n    const exportOptions: ExportOptions = {\n      format,\n      includeInteractions: true,\n      includeFeedback: true,\n      includeMetadata: true,\n      prettyPrint: format === ExportFormat.JSON,\n      ...options,\n    };\n\n    return this.storage.exportData(\n      exportOptions.format,\n      exportOptions.startTime,\n      exportOptions.endTime\n    );\n  }\n\n  /**\n   * Query and analyze feedback\n   */\n  async queryFeedback(filter: FeedbackFilter): Promise<Feedback[]> {\n    // Get all feedback in range without limit (limit is applied after offset)\n    let feedback = await this.storage.getFeedbackInRange(\n      filter.startTime || new Date(0),\n      filter.endTime || new Date()\n    );\n\n    // Apply filters\n    if (filter.types && filter.types.length > 0) {\n      feedback = feedback.filter(f => filter.types!.includes(f.type));\n    }\n\n    if (filter.userId) {\n      feedback = feedback.filter(f => f.userId === filter.userId);\n    }\n\n    if (filter.sessionId) {\n      feedback = feedback.filter(f => f.sessionId === filter.sessionId);\n    }\n\n    if (filter.interactionIds && filter.interactionIds.length > 0) {\n      feedback = feedback.filter(f => filter.interactionIds!.includes(f.interactionId));\n    }\n\n    if (filter.source) {\n      feedback = feedback.filter(f => f.source === filter.source);\n    }\n\n    if (filter.minRating !== undefined || filter.maxRating !== undefined) {\n      feedback = feedback.filter(f => {\n        if (f.type === FeedbackType.RATING) {\n          const data = f.data as RatingFeedbackData;\n          if (filter.minRating !== undefined && data.rating < filter.minRating) {\n            return false;\n          }\n          if (filter.maxRating !== undefined && data.rating > filter.maxRating) {\n            return false;\n          }\n        }\n        return true;\n      });\n    }\n\n    // Apply offset first, then limit\n    if (filter.offset) {\n      feedback = feedback.slice(filter.offset);\n    }\n\n    if (filter.limit) {\n      feedback = feedback.slice(0, filter.limit);\n    }\n\n    return feedback;\n  }\n\n  /**\n   * Get analytics results\n   */\n  async getAnalytics(filter?: FeedbackFilter): Promise<AnalyticsResult> {\n    const stats = await this.storage.calculateStats(\n      filter?.startTime,\n      filter?.endTime\n    );\n\n    const result: AnalyticsResult = {\n      query: {\n        startTime: filter?.startTime,\n        endTime: filter?.endTime,\n        filters: filter,\n      },\n      stats,\n      generatedAt: new Date(),\n    };\n\n    return result;\n  }\n\n  /**\n   * Flush batch queue manually\n   */\n  async flush(): Promise<void> {\n    if (this.batchQueue.length === 0) {\n      return;\n    }\n\n    const interactions = this.batchQueue\n      .filter(op => op.type === 'interaction')\n      .map(op => op.data as InteractionLog);\n\n    const feedback = this.batchQueue\n      .filter(op => op.type === 'feedback')\n      .map(op => op.data as Feedback);\n\n    this.log(`Flushing batch: ${interactions.length} interactions, ${feedback.length} feedback`);\n\n    if (interactions.length > 0) {\n      await this.storage.storeInteractionsBatch(interactions);\n    }\n\n    if (feedback.length > 0) {\n      await this.storage.storeFeedbackBatch(feedback);\n    }\n\n    this.batchQueue = [];\n  }\n\n  /**\n   * Start a new feedback session\n   */\n  startSession(userId?: string, metadata?: Record<string, any>): string {\n    if (this.currentSession) {\n      this.endSession();\n    }\n\n    const sessionId = randomUUID();\n    this.currentSession = {\n      id: sessionId,\n      userId,\n      startTime: new Date(),\n      interactionIds: [],\n      feedbackIds: [],\n      metadata,\n    };\n\n    this.resetSessionTimer();\n    this.log('Started session:', sessionId);\n    return sessionId;\n  }\n\n  /**\n   * End current feedback session\n   */\n  endSession(): FeedbackSession | null {\n    if (!this.currentSession) {\n      return null;\n    }\n\n    this.currentSession.endTime = new Date();\n    const session = { ...this.currentSession };\n\n    if (this.sessionTimer) {\n      clearTimeout(this.sessionTimer);\n      this.sessionTimer = undefined;\n    }\n\n    this.currentSession = undefined;\n    this.log('Ended session:', session.id);\n    return session;\n  }\n\n  /**\n   * Get current session\n   */\n  getCurrentSession(): FeedbackSession | null {\n    return this.currentSession ? { ...this.currentSession } : null;\n  }\n\n  /**\n   * Close the logger and cleanup\n   */\n  async close(): Promise<void> {\n    this.log('Closing RLHFLogger');\n\n    // Flush any pending batches\n    if (this.config.enableBatching) {\n      await this.flush();\n      if (this.batchTimer) {\n        clearTimeout(this.batchTimer);\n        this.batchTimer = undefined;\n      }\n    }\n\n    // End current session\n    if (this.currentSession) {\n      this.endSession();\n    }\n\n    // Close storage\n    await this.storage.close();\n    this.initialized = false;\n  }\n\n  /**\n   * Add operation to batch queue\n   */\n  private addToBatch(type: 'interaction' | 'feedback', data: InteractionLog | Feedback): void {\n    this.batchQueue.push({\n      type,\n      data,\n      timestamp: new Date(),\n    });\n\n    // Flush if batch size reached\n    if (this.batchQueue.length >= (this.config.batchSize || 50)) {\n      this.flush().catch(err => {\n        console.error('Error flushing batch:', err);\n      });\n    }\n  }\n\n  /**\n   * Start batch timer\n   */\n  private startBatchTimer(): void {\n    this.batchTimer = setInterval(() => {\n      this.flush().catch(err => {\n        console.error('Error flushing batch:', err);\n      });\n    }, this.config.batchFlushInterval || 5000);\n  }\n\n  /**\n   * Reset session timeout timer\n   */\n  private resetSessionTimer(): void {\n    if (this.sessionTimer) {\n      clearTimeout(this.sessionTimer);\n    }\n\n    this.sessionTimer = setTimeout(() => {\n      this.log('Session timeout, ending session');\n      this.endSession();\n    }, this.config.sessionTimeout || 1800000);\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(...args: any[]): void {\n    if (this.config.debug) {\n      console.log('[RLHFLogger]', ...args);\n    }\n  }\n}\n\n/**\n * Create a new RLHFLogger instance\n */\nexport function createRLHFLogger(config: RLHFConfig): RLHFLogger {\n  return new RLHFLogger(config);\n}\n","/**\n * RLHF Auto-Instrumentation\n *\n * Automatically captures AI stream interactions, feedback events,\n * and contextual data for Reinforcement Learning from Human Feedback (RLHF).\n */\n\nimport { EventEmitter } from 'events'\nimport type { AIStream } from '../streaming/AIStream'\nimport type { Message, Usage } from '../types'\nimport type {\n  InstrumentationConfig,\n  CapturedInteraction,\n  InstrumentationMetrics,\n  ContextData,\n  PerformanceMetrics,\n  FeedbackEvent,\n  ErrorEvent,\n  CustomInstrumentor,\n  InstrumentationMiddleware,\n  // InstrumentationStorage,\n  InteractionFilter,\n} from './instrumentation-types'\n\n/**\n * Default configuration for instrumentation\n */\nconst DEFAULT_CONFIG: Required<Omit<InstrumentationConfig, 'customContext' | 'onBufferFull' | 'onInteractionCaptured' | 'onFeedbackCaptured' | 'remoteEndpoint'>> = {\n  enabled: true,\n  captureInteractions: true,\n  captureFeedback: true,\n  captureMetrics: true,\n  captureErrors: true,\n  captureUsagePatterns: true,\n  collectContext: true,\n  sampleRate: 1.0,\n  maxBufferSize: 1000,\n  storage: 'memory',\n  batchSize: 10,\n  flushInterval: 60000,\n}\n\n/**\n * RLHFInstrumentation class\n *\n * Provides automatic instrumentation for AI streams to capture\n * interactions, feedback, and metrics for RLHF training.\n */\nexport class RLHFInstrumentation extends EventEmitter {\n  private config: InstrumentationConfig\n  private enabled: boolean = true\n  private sessionId: string\n  private buffer: CapturedInteraction[] = []\n  private metrics: InstrumentationMetrics\n  private customInstrumentors: CustomInstrumentor[] = []\n  private middleware: InstrumentationMiddleware[] = []\n  private flushTimer?: NodeJS.Timeout\n  private activeInteractions: Map<string, {\n    prompt: Message\n    startTime: number\n    firstTokenTime?: number\n  }> = new Map()\n\n  /**\n   * Create a new RLHF instrumentation instance\n   */\n  constructor(config: InstrumentationConfig = {}) {\n    super()\n    this.config = { ...DEFAULT_CONFIG, ...config }\n    this.enabled = this.config.enabled ?? true\n    this.sessionId = this.generateSessionId()\n\n    this.metrics = {\n      totalInteractions: 0,\n      totalFeedback: 0,\n      totalErrors: 0,\n      bufferSize: 0,\n      interactionsPerSession: new Map([[this.sessionId, 0]]),\n      averageResponseTime: 0,\n      averageTokensPerInteraction: 0,\n      feedbackRate: 0,\n      errorRate: 0,\n      positiveFeedbackRate: 0,\n      negativeFeedbackRate: 0,\n      startedAt: Date.now(),\n      remoteUploads: 0,\n      failedUploads: 0,\n    }\n\n    if (this.config.flushInterval && this.config.flushInterval > 0) {\n      this.startFlushTimer()\n    }\n  }\n\n  /**\n   * Instrument an AI stream for automatic capture\n   */\n  instrument(stream: AIStream): AIStream {\n    if (!this.enabled) {\n      return stream\n    }\n\n    // Listen to stream events\n    stream.on('message', (message: Message) => {\n      this.handleMessage(message)\n    })\n\n    stream.on('token', (token: string) => {\n      this.handleToken(token)\n    })\n\n    stream.on('usage', (usage: Usage) => {\n      this.handleUsage(usage)\n    })\n\n    stream.on('error', (error: Error) => {\n      this.handleError(error)\n    })\n\n    stream.on('streaming-start', () => {\n      this.handleStreamingStart()\n    })\n\n    stream.on('streaming-end', () => {\n      this.handleStreamingEnd()\n    })\n\n    stream.on('reset', () => {\n      this.handleReset()\n    })\n\n    return stream\n  }\n\n  /**\n   * Manually capture an interaction\n   */\n  captureInteraction(event: {\n    prompt: Message\n    response: Message\n    usage?: Usage\n    error?: Error\n  }): CapturedInteraction | null {\n    if (!this.enabled || !this.config.captureInteractions) {\n      return null\n    }\n\n    // Apply sampling\n    if (Math.random() > (this.config.sampleRate ?? 1.0)) {\n      return null\n    }\n\n    const context = this.collectContext()\n    const metrics = this.calculateMetrics(event)\n\n    const interaction: CapturedInteraction = {\n      id: this.generateId(),\n      sessionId: this.sessionId,\n      prompt: event.prompt,\n      response: event.response,\n      context,\n      metrics,\n      usage: event.usage,\n      feedback: [],\n      error: event.error ? this.createErrorEvent(event.error) : undefined,\n      timestamp: Date.now(),\n      metadata: {},\n    }\n\n    // Apply custom instrumentors\n    let processedInteraction: CapturedInteraction | null = interaction\n    for (const instrumentor of this.customInstrumentors) {\n      processedInteraction = instrumentor(processedInteraction)\n      if (!processedInteraction) {\n        return null\n      }\n    }\n\n    // Apply middleware\n    let middlewareIndex = 0\n    const runMiddleware = () => {\n      if (middlewareIndex < this.middleware.length) {\n        const current = this.middleware[middlewareIndex++]\n        if (current && processedInteraction) {\n          current(processedInteraction, runMiddleware)\n        }\n      } else {\n        if (processedInteraction) {\n          this.storeInteraction(processedInteraction)\n        }\n      }\n    }\n    runMiddleware()\n\n    return processedInteraction\n  }\n\n  /**\n   * Capture user feedback\n   */\n  captureFeedback(feedback: Omit<FeedbackEvent, 'id' | 'timestamp'>): void {\n    if (!this.enabled || !this.config.captureFeedback) {\n      return\n    }\n\n    const feedbackEvent: FeedbackEvent = {\n      id: this.generateId(),\n      timestamp: Date.now(),\n      ...feedback,\n    }\n\n    // Find the interaction and add feedback\n    const interaction = this.buffer.find(i => i.id === feedback.interactionId)\n    if (interaction) {\n      if (!interaction.feedback) {\n        interaction.feedback = []\n      }\n      interaction.feedback.push(feedbackEvent)\n    }\n\n    this.metrics.totalFeedback++\n    this.updateFeedbackMetrics(feedbackEvent)\n\n    this.emit('feedback-captured', feedbackEvent)\n\n    if (this.config.onFeedbackCaptured) {\n      this.config.onFeedbackCaptured(feedbackEvent)\n    }\n  }\n\n  /**\n   * Collect contextual data\n   */\n  collectContext(): ContextData {\n    if (!this.config.collectContext) {\n      return {}\n    }\n\n    const context: ContextData = {\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n      custom: this.config.customContext,\n    }\n\n    // Collect browser-specific context if available\n    if (typeof navigator !== 'undefined') {\n      context.userAgent = navigator.userAgent\n      context.platform = navigator.platform\n    }\n\n    if (typeof window !== 'undefined') {\n      context.url = window.location.href\n      context.referrer = document.referrer\n      context.screenResolution = `${window.screen.width}x${window.screen.height}`\n    }\n\n    // Determine device type\n    if (context.userAgent) {\n      context.deviceType = this.detectDeviceType(context.userAgent)\n    }\n\n    return context\n  }\n\n  /**\n   * Enable instrumentation\n   */\n  enable(): void {\n    this.enabled = true\n    this.emit('enabled')\n\n    if (this.config.flushInterval && !this.flushTimer) {\n      this.startFlushTimer()\n    }\n  }\n\n  /**\n   * Disable instrumentation\n   */\n  disable(): void {\n    this.enabled = false\n    this.emit('disabled')\n\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer)\n      this.flushTimer = undefined\n    }\n  }\n\n  /**\n   * Get instrumentation metrics\n   */\n  getMetrics(): InstrumentationMetrics {\n    return { ...this.metrics }\n  }\n\n  /**\n   * Get captured interactions\n   */\n  getInteractions(filter?: InteractionFilter): CapturedInteraction[] {\n    let interactions = [...this.buffer]\n\n    if (!filter) {\n      return interactions\n    }\n\n    // Apply filters\n    if (filter.sessionId) {\n      interactions = interactions.filter(i => i.sessionId === filter.sessionId)\n    }\n\n    if (filter.startDate) {\n      interactions = interactions.filter(i => i.timestamp >= filter.startDate!)\n    }\n\n    if (filter.endDate) {\n      interactions = interactions.filter(i => i.timestamp <= filter.endDate!)\n    }\n\n    if (filter.hasFeedback !== undefined) {\n      interactions = interactions.filter(i =>\n        filter.hasFeedback ? (i.feedback && i.feedback.length > 0) : !i.feedback || i.feedback.length === 0\n      )\n    }\n\n    if (filter.hasError !== undefined) {\n      interactions = interactions.filter(i =>\n        filter.hasError ? !!i.error : !i.error\n      )\n    }\n\n    // Apply limit and offset\n    const offset = filter.offset ?? 0\n    const limit = filter.limit ?? interactions.length\n\n    return interactions.slice(offset, offset + limit)\n  }\n\n  /**\n   * Clear all captured data\n   */\n  clear(): void {\n    this.buffer = []\n    this.metrics.bufferSize = 0\n    this.activeInteractions.clear()\n  }\n\n  /**\n   * Flush buffered interactions\n   */\n  async flush(): Promise<void> {\n    if (this.buffer.length === 0) {\n      return\n    }\n\n    const interactions = [...this.buffer]\n\n    this.emit('flushed', interactions)\n\n    // Upload to remote endpoint if configured\n    if (this.config.storage === 'remote' && this.config.remoteEndpoint) {\n      await this.uploadToRemote(interactions)\n    }\n\n    this.metrics.lastFlushAt = Date.now()\n  }\n\n  /**\n   * Add custom instrumentor\n   */\n  addInstrumentor(instrumentor: CustomInstrumentor): void {\n    this.customInstrumentors.push(instrumentor)\n  }\n\n  /**\n   * Add middleware\n   */\n  addMiddleware(middleware: InstrumentationMiddleware): void {\n    this.middleware.push(middleware)\n  }\n\n  /**\n   * Remove custom instrumentor\n   */\n  removeInstrumentor(instrumentor: CustomInstrumentor): void {\n    const index = this.customInstrumentors.indexOf(instrumentor)\n    if (index > -1) {\n      this.customInstrumentors.splice(index, 1)\n    }\n  }\n\n  /**\n   * Remove middleware\n   */\n  removeMiddleware(middleware: InstrumentationMiddleware): void {\n    const index = this.middleware.indexOf(middleware)\n    if (index > -1) {\n      this.middleware.splice(index, 1)\n    }\n  }\n\n  /**\n   * Handle message event from stream\n   */\n  private handleMessage(message: Message): void {\n    if (message.role === 'user') {\n      // Start tracking this interaction\n      this.activeInteractions.set(message.id, {\n        prompt: message,\n        startTime: Date.now(),\n      })\n    } else if (message.role === 'assistant') {\n      // Complete the interaction\n      const activeInteraction = this.findActiveInteraction()\n      if (activeInteraction) {\n        this.completeInteraction(activeInteraction.prompt, message)\n      }\n    }\n  }\n\n  /**\n   * Handle token event from stream\n   */\n  private handleToken(_token: string): void {\n    if (!this.config.captureMetrics) {\n      return\n    }\n\n    const activeInteraction = this.findActiveInteraction()\n    if (activeInteraction && !activeInteraction.firstTokenTime) {\n      activeInteraction.firstTokenTime = Date.now()\n    }\n  }\n\n  /**\n   * Handle usage event from stream\n   */\n  private handleUsage(_usage: Usage): void {\n    // Usage will be attached to the interaction when completed\n  }\n\n  /**\n   * Handle error event from stream\n   */\n  private handleError(error: Error): void {\n    if (!this.config.captureErrors) {\n      return\n    }\n\n    const activeInteraction = this.findActiveInteraction()\n    if (activeInteraction) {\n      // Error will be attached to the interaction\n    }\n\n    this.metrics.totalErrors++\n    this.updateErrorRate()\n\n    this.emit('error-captured', this.createErrorEvent(error))\n  }\n\n  /**\n   * Handle streaming start event\n   */\n  private handleStreamingStart(): void {\n    // Streaming started\n  }\n\n  /**\n   * Handle streaming end event\n   */\n  private handleStreamingEnd(): void {\n    // Streaming ended\n  }\n\n  /**\n   * Handle reset event\n   */\n  private handleReset(): void {\n    this.activeInteractions.clear()\n  }\n\n  /**\n   * Find the most recent active interaction\n   */\n  private findActiveInteraction(): { prompt: Message; startTime: number; firstTokenTime?: number } | undefined {\n    // Get the most recent interaction\n    const entries = Array.from(this.activeInteractions.entries())\n    if (entries.length === 0) {\n      return undefined\n    }\n    const lastEntry = entries[entries.length - 1]\n    return lastEntry?.[1]\n  }\n\n  /**\n   * Complete an interaction\n   */\n  private completeInteraction(prompt: Message, response: Message): void {\n    this.captureInteraction({\n      prompt,\n      response,\n    })\n\n    // Remove from active interactions\n    this.activeInteractions.delete(prompt.id)\n  }\n\n  /**\n   * Store interaction in buffer\n   */\n  private storeInteraction(interaction: CapturedInteraction): void {\n    this.buffer.push(interaction)\n    this.metrics.bufferSize = this.buffer.length\n    this.metrics.totalInteractions++\n\n    // Update session interactions count\n    const sessionCount = this.metrics.interactionsPerSession.get(this.sessionId) ?? 0\n    this.metrics.interactionsPerSession.set(this.sessionId, sessionCount + 1)\n\n    this.metrics.lastInteractionAt = interaction.timestamp\n    this.updateAverageMetrics(interaction)\n\n    this.emit('interaction-captured', interaction)\n\n    if (this.config.onInteractionCaptured) {\n      this.config.onInteractionCaptured(interaction)\n    }\n\n    // Check buffer size\n    if (this.buffer.length >= (this.config.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize)) {\n      this.handleBufferFull()\n    }\n  }\n\n  /**\n   * Handle buffer full event\n   */\n  private handleBufferFull(): void {\n    const interactions = [...this.buffer]\n\n    this.emit('buffer-full', interactions)\n\n    if (this.config.onBufferFull) {\n      this.config.onBufferFull(interactions)\n    }\n\n    // Auto-flush if configured\n    if (this.config.storage === 'remote') {\n      this.flush().catch(error => {\n        console.error('Failed to flush buffer:', error)\n      })\n    }\n  }\n\n  /**\n   * Calculate performance metrics\n   */\n  private calculateMetrics(event: {\n    prompt: Message\n    response: Message\n  }): PerformanceMetrics {\n    const activeInteraction = this.activeInteractions.get(event.prompt.id)\n\n    const totalResponseTime = activeInteraction\n      ? Date.now() - activeInteraction.startTime\n      : event.response.timestamp - event.prompt.timestamp\n\n    const timeToFirstToken = activeInteraction?.firstTokenTime\n      ? activeInteraction.firstTokenTime - activeInteraction.startTime\n      : undefined\n\n    const metrics: PerformanceMetrics = {\n      totalResponseTime,\n      timeToFirstToken,\n      retryCount: 0,\n    }\n\n    return metrics\n  }\n\n  /**\n   * Create error event from Error object\n   */\n  private createErrorEvent(error: Error): ErrorEvent {\n    return {\n      message: error.message,\n      stack: error.stack,\n      type: error.name,\n      timestamp: Date.now(),\n      recoverable: false,\n    }\n  }\n\n  /**\n   * Update average metrics\n   */\n  private updateAverageMetrics(interaction: CapturedInteraction): void {\n    const total = this.metrics.totalInteractions\n\n    // Update average response time\n    this.metrics.averageResponseTime =\n      (this.metrics.averageResponseTime * (total - 1) + (interaction.metrics?.totalResponseTime ?? 0)) / total\n\n    // Update average tokens per interaction\n    const totalTokens = (interaction.usage?.totalTokens ?? 0)\n    this.metrics.averageTokensPerInteraction =\n      (this.metrics.averageTokensPerInteraction * (total - 1) + totalTokens) / total\n\n    // Update feedback rate\n    this.metrics.feedbackRate = this.metrics.totalFeedback / total\n\n    // Update error rate\n    this.updateErrorRate()\n  }\n\n  /**\n   * Update error rate\n   */\n  private updateErrorRate(): void {\n    if (this.metrics.totalInteractions > 0) {\n      this.metrics.errorRate = this.metrics.totalErrors / this.metrics.totalInteractions\n    }\n  }\n\n  /**\n   * Update feedback metrics\n   */\n  private updateFeedbackMetrics(feedback: FeedbackEvent): void {\n    const total = this.metrics.totalFeedback\n\n    if (total === 0) {\n      return\n    }\n\n    // Update feedback rate\n    if (this.metrics.totalInteractions > 0) {\n      this.metrics.feedbackRate = total / this.metrics.totalInteractions\n    }\n\n    // Update positive/negative feedback rates\n    let positiveCount = this.metrics.positiveFeedbackRate * (total - 1)\n    let negativeCount = this.metrics.negativeFeedbackRate * (total - 1)\n\n    if (feedback.type === 'thumbs-up' || (feedback.type === 'rating' && typeof feedback.value === 'number' && feedback.value > 3)) {\n      positiveCount++\n    } else if (feedback.type === 'thumbs-down' || (feedback.type === 'rating' && typeof feedback.value === 'number' && feedback.value <= 3)) {\n      negativeCount++\n    }\n\n    this.metrics.positiveFeedbackRate = positiveCount / total\n    this.metrics.negativeFeedbackRate = negativeCount / total\n  }\n\n  /**\n   * Start flush timer\n   */\n  private startFlushTimer(): void {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer)\n    }\n\n    this.flushTimer = setInterval(() => {\n      this.flush().catch(error => {\n        console.error('Scheduled flush failed:', error)\n      })\n    }, this.config.flushInterval ?? DEFAULT_CONFIG.flushInterval)\n  }\n\n  /**\n   * Upload interactions to remote endpoint\n   */\n  private async uploadToRemote(interactions: CapturedInteraction[]): Promise<void> {\n    if (!this.config.remoteEndpoint) {\n      return\n    }\n\n    const batchSize = this.config.batchSize ?? DEFAULT_CONFIG.batchSize\n    const batches: CapturedInteraction[][] = []\n\n    for (let i = 0; i < interactions.length; i += batchSize) {\n      batches.push(interactions.slice(i, i + batchSize))\n    }\n\n    for (const batch of batches) {\n      try {\n        const response = await fetch(this.config.remoteEndpoint, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({\n            sessionId: this.sessionId,\n            interactions: batch,\n            timestamp: Date.now(),\n          }),\n        })\n\n        if (!response.ok) {\n          throw new Error(`Upload failed: ${response.status}`)\n        }\n\n        this.metrics.remoteUploads = (this.metrics.remoteUploads ?? 0) + 1\n      } catch (error) {\n        console.error('Failed to upload batch:', error)\n        this.metrics.failedUploads = (this.metrics.failedUploads ?? 0) + 1\n      }\n    }\n  }\n\n  /**\n   * Detect device type from user agent\n   */\n  private detectDeviceType(userAgent: string): 'desktop' | 'mobile' | 'tablet' | 'unknown' {\n    const ua = userAgent.toLowerCase()\n\n    if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n      return 'tablet'\n    }\n\n    if (/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n      return 'mobile'\n    }\n\n    return 'desktop'\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  /**\n   * Generate session ID\n   */\n  private generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n  }\n\n  /**\n   * Clean up resources\n   */\n  destroy(): void {\n    this.disable()\n    this.clear()\n    this.removeAllListeners()\n    this.customInstrumentors = []\n    this.middleware = []\n  }\n}\n\n/**\n * Create a new instrumentation instance\n */\nexport function createInstrumentation(config?: InstrumentationConfig): RLHFInstrumentation {\n  return new RLHFInstrumentation(config)\n}\n","/**\n * Design Constraints Type Definitions\n *\n * Type system for defining and enforcing design constraints in AI-generated designs\n * through prompt engineering.\n */\n\n/**\n * Types of design constraints\n */\nexport enum ConstraintType {\n  LAYOUT = 'layout',\n  COLOR = 'color',\n  TYPOGRAPHY = 'typography',\n  COMPONENT = 'component',\n  ACCESSIBILITY = 'accessibility',\n  SPACING = 'spacing',\n  SIZING = 'sizing',\n  ANIMATION = 'animation',\n  RESPONSIVE = 'responsive',\n  CUSTOM = 'custom',\n}\n\n/**\n * Priority levels for constraints\n */\nexport enum ConstraintPriority {\n  CRITICAL = 'critical',     // Must be followed, validation fails if violated\n  HIGH = 'high',             // Strongly recommended, generates warnings\n  MEDIUM = 'medium',         // Recommended, generates suggestions\n  LOW = 'low',               // Optional, nice to have\n}\n\n/**\n * Layout system types\n */\nexport enum LayoutSystem {\n  GRID = 'grid',\n  FLEXBOX = 'flexbox',\n  STACK = 'stack',\n  ABSOLUTE = 'absolute',\n  FLOAT = 'float',\n}\n\n/**\n * Color format types\n */\nexport enum ColorFormat {\n  HEX = 'hex',\n  RGB = 'rgb',\n  RGBA = 'rgba',\n  HSL = 'hsl',\n  HSLA = 'hsla',\n  NAMED = 'named',\n}\n\n/**\n * WCAG compliance levels\n */\nexport enum WCAGLevel {\n  A = 'A',\n  AA = 'AA',\n  AAA = 'AAA',\n}\n\n/**\n * Base constraint interface\n */\nexport interface BaseConstraint {\n  id: string;\n  type: ConstraintType;\n  name: string;\n  description?: string;\n  priority: ConstraintPriority;\n  enabled: boolean;\n  tags?: string[];\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Layout constraint definition\n */\nexport interface LayoutConstraint extends BaseConstraint {\n  type: ConstraintType.LAYOUT;\n  rules: {\n    system?: LayoutSystem[];\n    gridColumns?: number | { min: number; max: number };\n    gridGap?: string | number;\n    maxWidth?: string | number;\n    minWidth?: string | number;\n    maxHeight?: string | number;\n    minHeight?: string | number;\n    aspectRatio?: string;\n    alignment?: ('left' | 'center' | 'right' | 'justify')[];\n    direction?: ('row' | 'column' | 'row-reverse' | 'column-reverse')[];\n    wrap?: boolean;\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Color palette definition\n */\nexport interface ColorPalette {\n  primary: string[];\n  secondary?: string[];\n  accent?: string[];\n  neutral?: string[];\n  semantic?: {\n    success?: string[];\n    warning?: string[];\n    error?: string[];\n    info?: string[];\n  };\n  custom?: Record<string, string[]>;\n}\n\n/**\n * Color constraint definition\n */\nexport interface ColorConstraint extends BaseConstraint {\n  type: ConstraintType.COLOR;\n  rules: {\n    palette?: ColorPalette;\n    formats?: ColorFormat[];\n    maxColors?: number;\n    minContrast?: number; // WCAG contrast ratio\n    allowedColors?: string[];\n    forbiddenColors?: string[];\n    colorHarmony?: ('monochromatic' | 'analogous' | 'complementary' | 'triadic' | 'tetradic')[];\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Typography scale\n */\nexport interface TypographyScale {\n  baseSize: number;\n  ratio: number; // e.g., 1.25 for major third\n  sizes?: {\n    xs?: number;\n    sm?: number;\n    base?: number;\n    lg?: number;\n    xl?: number;\n    '2xl'?: number;\n    '3xl'?: number;\n    '4xl'?: number;\n    [key: string]: number | undefined;\n  };\n}\n\n/**\n * Typography constraint definition\n */\nexport interface TypographyConstraint extends BaseConstraint {\n  type: ConstraintType.TYPOGRAPHY;\n  rules: {\n    fontFamilies?: {\n      heading?: string[];\n      body?: string[];\n      monospace?: string[];\n      custom?: Record<string, string[]>;\n    };\n    scale?: TypographyScale;\n    weights?: number[];\n    lineHeights?: {\n      tight?: number;\n      normal?: number;\n      relaxed?: number;\n      loose?: number;\n      custom?: Record<string, number>;\n    };\n    letterSpacing?: {\n      tight?: string;\n      normal?: string;\n      wide?: string;\n      custom?: Record<string, string>;\n    };\n    maxLevels?: number; // Maximum hierarchy levels\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Component size variants\n */\nexport interface ComponentSizes {\n  xs?: { width?: string; height?: string; padding?: string };\n  sm?: { width?: string; height?: string; padding?: string };\n  md?: { width?: string; height?: string; padding?: string };\n  lg?: { width?: string; height?: string; padding?: string };\n  xl?: { width?: string; height?: string; padding?: string };\n  [key: string]: { width?: string; height?: string; padding?: string } | undefined;\n}\n\n/**\n * Component constraint definition\n */\nexport interface ComponentConstraint extends BaseConstraint {\n  type: ConstraintType.COMPONENT;\n  rules: {\n    allowedComponents?: string[];\n    forbiddenComponents?: string[];\n    sizes?: ComponentSizes;\n    variants?: string[];\n    maxNestingLevel?: number;\n    composition?: {\n      maxChildren?: number;\n      allowedChildren?: string[];\n      forbiddenChildren?: string[];\n    };\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Accessibility constraint definition\n */\nexport interface AccessibilityConstraint extends BaseConstraint {\n  type: ConstraintType.ACCESSIBILITY;\n  rules: {\n    wcagLevel?: WCAGLevel;\n    minContrast?: number;\n    requireAltText?: boolean;\n    requireAriaLabels?: boolean;\n    keyboardNavigable?: boolean;\n    focusVisible?: boolean;\n    screenReaderOptimized?: boolean;\n    colorBlindSafe?: boolean;\n    minTouchTarget?: number; // in pixels\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Spacing system\n */\nexport interface SpacingSystem {\n  base: number;\n  scale?: number[];\n  custom?: Record<string, number>;\n}\n\n/**\n * Spacing constraint definition\n */\nexport interface SpacingConstraint extends BaseConstraint {\n  type: ConstraintType.SPACING;\n  rules: {\n    system?: SpacingSystem;\n    minSpacing?: number;\n    maxSpacing?: number;\n    consistent?: boolean; // Enforce consistent spacing\n    customRules?: Record<string, unknown>;\n  };\n}\n\n/**\n * Custom constraint definition\n */\nexport interface CustomConstraint extends BaseConstraint {\n  type: ConstraintType.CUSTOM;\n  rules: Record<string, unknown>;\n  validator?: (design: unknown) => ValidationResult;\n  promptGenerator?: (rules: Record<string, unknown>) => string[];\n}\n\n/**\n * Union type for all constraints\n */\nexport type Constraint =\n  | LayoutConstraint\n  | ColorConstraint\n  | TypographyConstraint\n  | ComponentConstraint\n  | AccessibilityConstraint\n  | SpacingConstraint\n  | CustomConstraint;\n\n/**\n * Validation severity levels\n */\nexport enum ValidationSeverity {\n  ERROR = 'error',\n  WARNING = 'warning',\n  INFO = 'info',\n  SUCCESS = 'success',\n}\n\n/**\n * Validation issue\n */\nexport interface ValidationIssue {\n  constraintId: string;\n  constraintType: ConstraintType;\n  severity: ValidationSeverity;\n  message: string;\n  path?: string; // Path to the violating element\n  expected?: unknown;\n  actual?: unknown;\n  suggestion?: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n  valid: boolean;\n  score: number; // 0-100, percentage of constraints met\n  issues: ValidationIssue[];\n  summary: {\n    total: number;\n    passed: number;\n    failed: number;\n    warnings: number;\n  };\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Prompt instruction format\n */\nexport interface PromptInstruction {\n  section: string;\n  priority: ConstraintPriority;\n  instructions: string[];\n  examples?: string[];\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Constraint template\n */\nexport interface ConstraintTemplate {\n  id: string;\n  name: string;\n  description: string;\n  category: string;\n  version: string;\n  author?: string;\n  constraints: Constraint[];\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Conditional constraint\n */\nexport interface ConditionalConstraint {\n  condition: {\n    property: string;\n    operator: 'equals' | 'notEquals' | 'contains' | 'greaterThan' | 'lessThan' | 'matches';\n    value: unknown;\n  };\n  thenConstraints: Constraint[];\n  elseConstraints?: Constraint[];\n}\n\n/**\n * Constraint set configuration\n */\nexport interface ConstraintSetConfig {\n  name: string;\n  description?: string;\n  baseTemplate?: string; // Template ID to extend\n  constraints: Constraint[];\n  conditionalConstraints?: ConditionalConstraint[];\n  strict?: boolean; // Fail validation on any error\n  allowPartial?: boolean; // Allow partial compliance\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Conflict resolution strategy\n */\nexport enum ConflictStrategy {\n  OVERRIDE = 'override',         // Later constraint overrides earlier\n  MERGE = 'merge',               // Merge constraint rules\n  STRICT = 'strict',             // Fail on conflicts\n  PRIORITIZE = 'prioritize',     // Use higher priority constraint\n  IGNORE_DUPLICATES = 'ignore_duplicates', // Skip duplicate constraints\n}\n\n/**\n * Merge options\n */\nexport interface MergeOptions {\n  strategy: ConflictStrategy;\n  preserveIds?: boolean;\n  mergeTags?: boolean;\n  mergeMetadata?: boolean;\n}\n\n/**\n * Natural language constraint input\n */\nexport interface NaturalLanguageConstraint {\n  description: string;\n  type?: ConstraintType;\n  priority?: ConstraintPriority;\n  examples?: string[];\n}\n\n/**\n * Constraint parsing result\n */\nexport interface ConstraintParseResult {\n  success: boolean;\n  constraints: Constraint[];\n  errors?: string[];\n  warnings?: string[];\n  confidence?: number; // 0-1\n}\n\n/**\n * Design output for validation\n */\nexport interface DesignOutput {\n  components?: unknown[];\n  styles?: Record<string, unknown>;\n  layout?: unknown;\n  colors?: string[];\n  typography?: unknown;\n  metadata?: Record<string, unknown>;\n  [key: string]: unknown;\n}\n\n/**\n * Prompt generation options\n */\nexport interface PromptGenerationOptions {\n  format?: 'structured' | 'natural' | 'mixed';\n  includeExamples?: boolean;\n  groupByType?: boolean;\n  priorityThreshold?: ConstraintPriority;\n  maxLength?: number;\n  template?: string;\n}\n\n","/**\n * Design Constraints System\n *\n * Define and enforce design constraints in AI-generated designs through\n * prompt engineering and validation.\n */\n\nimport {\n  Constraint,\n  ConstraintType,\n  ConstraintPriority,\n  ConstraintSetConfig,\n  ValidationResult,\n  ValidationIssue,\n  ValidationSeverity,\n  PromptInstruction,\n  PromptGenerationOptions,\n  DesignOutput,\n  MergeOptions,\n  ConflictStrategy,\n  LayoutConstraint,\n  ColorConstraint,\n  TypographyConstraint,\n  ComponentConstraint,\n  AccessibilityConstraint,\n  SpacingConstraint,\n  CustomConstraint,\n  NaturalLanguageConstraint,\n  ConstraintParseResult,\n  ConditionalConstraint,\n  WCAGLevel,\n} from './types';\n\n/**\n * Design Constraints Class\n *\n * Main class for managing design constraints, generating prompt instructions,\n * and validating AI-generated designs.\n */\nexport class DesignConstraints {\n  private constraints: Map<string, Constraint>;\n  private conditionalConstraints: ConditionalConstraint[];\n  private config: ConstraintSetConfig;\n\n  constructor(config: ConstraintSetConfig) {\n    this.config = config;\n    this.constraints = new Map();\n    this.conditionalConstraints = config.conditionalConstraints || [];\n\n    // Initialize constraints\n    config.constraints.forEach((constraint) => {\n      this.constraints.set(constraint.id, constraint);\n    });\n  }\n\n  /**\n   * Define a new constraint\n   */\n  public defineConstraint(constraint: Constraint): void {\n    this.constraints.set(constraint.id, constraint);\n  }\n\n  /**\n   * Define a layout constraint\n   */\n  public defineLayoutConstraint(\n    id: string,\n    rules: LayoutConstraint['rules'],\n    options: Partial<Omit<LayoutConstraint, 'type' | 'rules'>> = {}\n  ): LayoutConstraint {\n    const constraint: LayoutConstraint = {\n      id,\n      type: ConstraintType.LAYOUT,\n      name: options.name || 'Layout Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define a color constraint\n   */\n  public defineColorConstraint(\n    id: string,\n    rules: ColorConstraint['rules'],\n    options: Partial<Omit<ColorConstraint, 'type' | 'rules'>> = {}\n  ): ColorConstraint {\n    const constraint: ColorConstraint = {\n      id,\n      type: ConstraintType.COLOR,\n      name: options.name || 'Color Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define a typography constraint\n   */\n  public defineTypographyConstraint(\n    id: string,\n    rules: TypographyConstraint['rules'],\n    options: Partial<Omit<TypographyConstraint, 'type' | 'rules'>> = {}\n  ): TypographyConstraint {\n    const constraint: TypographyConstraint = {\n      id,\n      type: ConstraintType.TYPOGRAPHY,\n      name: options.name || 'Typography Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define a component constraint\n   */\n  public defineComponentConstraint(\n    id: string,\n    rules: ComponentConstraint['rules'],\n    options: Partial<Omit<ComponentConstraint, 'type' | 'rules'>> = {}\n  ): ComponentConstraint {\n    const constraint: ComponentConstraint = {\n      id,\n      type: ConstraintType.COMPONENT,\n      name: options.name || 'Component Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define an accessibility constraint\n   */\n  public defineAccessibilityConstraint(\n    id: string,\n    rules: AccessibilityConstraint['rules'],\n    options: Partial<Omit<AccessibilityConstraint, 'type' | 'rules'>> = {}\n  ): AccessibilityConstraint {\n    const constraint: AccessibilityConstraint = {\n      id,\n      type: ConstraintType.ACCESSIBILITY,\n      name: options.name || 'Accessibility Constraint',\n      priority: options.priority || ConstraintPriority.HIGH,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define a spacing constraint\n   */\n  public defineSpacingConstraint(\n    id: string,\n    rules: SpacingConstraint['rules'],\n    options: Partial<Omit<SpacingConstraint, 'type' | 'rules'>> = {}\n  ): SpacingConstraint {\n    const constraint: SpacingConstraint = {\n      id,\n      type: ConstraintType.SPACING,\n      name: options.name || 'Spacing Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Define a custom constraint\n   */\n  public defineCustomConstraint(\n    id: string,\n    rules: Record<string, unknown>,\n    options: Partial<Omit<CustomConstraint, 'type' | 'rules'>> = {}\n  ): CustomConstraint {\n    const constraint: CustomConstraint = {\n      id,\n      type: ConstraintType.CUSTOM,\n      name: options.name || 'Custom Constraint',\n      priority: options.priority || ConstraintPriority.MEDIUM,\n      enabled: options.enabled !== undefined ? options.enabled : true,\n      description: options.description,\n      tags: options.tags,\n      metadata: options.metadata,\n      rules,\n      validator: options.validator,\n      promptGenerator: options.promptGenerator,\n    };\n\n    this.defineConstraint(constraint);\n    return constraint;\n  }\n\n  /**\n   * Parse natural language constraint\n   */\n  public parseNaturalLanguage(input: NaturalLanguageConstraint): ConstraintParseResult {\n    const constraints: Constraint[] = [];\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      // Simple pattern matching for common constraint types\n      const description = input.description.toLowerCase();\n\n      // Layout constraints\n      if (description.includes('grid') || description.includes('column')) {\n        const gridMatch = description.match(/(\\d+)\\s*columns?/);\n        if (gridMatch && gridMatch[1]) {\n          const columns = parseInt(gridMatch[1], 10);\n          constraints.push(\n            this.defineLayoutConstraint(\n              `nl_layout_${Date.now()}`,\n              { gridColumns: columns },\n              { priority: input.priority || ConstraintPriority.MEDIUM }\n            )\n          );\n        }\n      }\n\n      // Color constraints\n      if (description.includes('color') || description.includes('palette')) {\n        const colorMatch = description.match(/#[0-9a-f]{6}/gi);\n        if (colorMatch) {\n          constraints.push(\n            this.defineColorConstraint(\n              `nl_color_${Date.now()}`,\n              { allowedColors: colorMatch },\n              { priority: input.priority || ConstraintPriority.MEDIUM }\n            )\n          );\n        }\n      }\n\n      // Typography constraints\n      if (description.includes('font') || description.includes('typography')) {\n        const fontMatch = description.match(/(?:use|font-family:?)\\s*['\"]([^'\"]+)['\"]/i);\n        if (fontMatch && fontMatch[1]) {\n          constraints.push(\n            this.defineTypographyConstraint(\n              `nl_typography_${Date.now()}`,\n              { fontFamilies: { body: [fontMatch[1]] } },\n              { priority: input.priority || ConstraintPriority.MEDIUM }\n            )\n          );\n        }\n      }\n\n      // Accessibility constraints\n      if (description.includes('accessible') || description.includes('wcag') || description.includes('a11y')) {\n        const wcagMatch = description.match(/wcag\\s*(a{1,3})/i);\n        const level = wcagMatch?.[1] ? (wcagMatch[1].toUpperCase() as WCAGLevel) : WCAGLevel.AA;\n        constraints.push(\n          this.defineAccessibilityConstraint(\n            `nl_a11y_${Date.now()}`,\n            { wcagLevel: level, requireAltText: true, requireAriaLabels: true },\n            { priority: input.priority || ConstraintPriority.HIGH }\n          )\n        );\n      }\n\n      if (constraints.length === 0) {\n        warnings.push('Could not extract specific constraints from description');\n        // Create a generic custom constraint\n        constraints.push(\n          this.defineCustomConstraint(\n            `nl_custom_${Date.now()}`,\n            { description: input.description },\n            { priority: input.priority || ConstraintPriority.LOW }\n          )\n        );\n      }\n\n      return {\n        success: true,\n        constraints,\n        warnings: warnings.length > 0 ? warnings : undefined,\n        confidence: constraints.length > 1 ? 0.8 : 0.5,\n      };\n    } catch (error) {\n      errors.push(`Failed to parse constraint: ${error instanceof Error ? error.message : String(error)}`);\n      return {\n        success: false,\n        constraints: [],\n        errors,\n      };\n    }\n  }\n\n  /**\n   * Convert constraints to prompt instructions\n   */\n  public toPromptInstructions(options: PromptGenerationOptions = {}): PromptInstruction[] {\n    const {\n      format = 'structured',\n      includeExamples = true,\n      groupByType = true,\n      priorityThreshold = ConstraintPriority.LOW,\n      maxLength,\n    } = options;\n\n    const instructions: PromptInstruction[] = [];\n    const enabledConstraints = Array.from(this.constraints.values()).filter(\n      (c) => c.enabled && this.isPriorityAtLeast(c.priority, priorityThreshold)\n    );\n\n    if (groupByType) {\n      const grouped = this.groupByType(enabledConstraints);\n\n      for (const [type, constraints] of Array.from(grouped.entries())) {\n        const section = this.getTypeSectionName(type);\n        const sectionInstructions: string[] = [];\n\n        for (const constraint of constraints) {\n          const constraintInstructions = this.generateConstraintInstructions(constraint, format);\n          sectionInstructions.push(...constraintInstructions);\n        }\n\n        if (sectionInstructions.length > 0) {\n          const highestPriority = this.getHighestPriority(constraints);\n          instructions.push({\n            section,\n            priority: highestPriority,\n            instructions: maxLength\n              ? sectionInstructions.slice(0, maxLength)\n              : sectionInstructions,\n            examples: includeExamples ? this.generateExamples(type, constraints) : undefined,\n          });\n        }\n      }\n    } else {\n      const allInstructions: string[] = [];\n      for (const constraint of enabledConstraints) {\n        const constraintInstructions = this.generateConstraintInstructions(constraint, format);\n        allInstructions.push(...constraintInstructions);\n      }\n\n      instructions.push({\n        section: 'Design Constraints',\n        priority: this.getHighestPriority(enabledConstraints),\n        instructions: maxLength ? allInstructions.slice(0, maxLength) : allInstructions,\n      });\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate constraint instructions based on format\n   */\n  private generateConstraintInstructions(\n    constraint: Constraint,\n    format: 'structured' | 'natural' | 'mixed'\n  ): string[] {\n    const instructions: string[] = [];\n\n    switch (constraint.type) {\n      case ConstraintType.LAYOUT:\n        instructions.push(...this.generateLayoutInstructions(constraint, format));\n        break;\n      case ConstraintType.COLOR:\n        instructions.push(...this.generateColorInstructions(constraint, format));\n        break;\n      case ConstraintType.TYPOGRAPHY:\n        instructions.push(...this.generateTypographyInstructions(constraint, format));\n        break;\n      case ConstraintType.COMPONENT:\n        instructions.push(...this.generateComponentInstructions(constraint, format));\n        break;\n      case ConstraintType.ACCESSIBILITY:\n        instructions.push(...this.generateAccessibilityInstructions(constraint, format));\n        break;\n      case ConstraintType.SPACING:\n        instructions.push(...this.generateSpacingInstructions(constraint, format));\n        break;\n      case ConstraintType.CUSTOM:\n        instructions.push(...this.generateCustomInstructions(constraint, format));\n        break;\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate layout instructions\n   */\n  private generateLayoutInstructions(\n    constraint: LayoutConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.system) {\n        instructions.push(`Use ${rules.system.join(' or ')} layout system`);\n      }\n      if (rules.gridColumns) {\n        const cols = typeof rules.gridColumns === 'number'\n          ? rules.gridColumns\n          : `${rules.gridColumns.min}-${rules.gridColumns.max}`;\n        instructions.push(`Layout should use ${cols} columns`);\n      }\n      if (rules.maxWidth) {\n        instructions.push(`Maximum width should be ${rules.maxWidth}`);\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      if (rules.system) {\n        instructions.push(`LAYOUT_SYSTEM: ${rules.system.join(', ')}`);\n      }\n      if (rules.gridColumns) {\n        instructions.push(`GRID_COLUMNS: ${JSON.stringify(rules.gridColumns)}`);\n      }\n      if (rules.gridGap) {\n        instructions.push(`GRID_GAP: ${rules.gridGap}`);\n      }\n      if (rules.alignment) {\n        instructions.push(`ALIGNMENT: ${rules.alignment.join(', ')}`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate color instructions\n   */\n  private generateColorInstructions(\n    constraint: ColorConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.palette) {\n        instructions.push(`Use color palette: primary colors ${rules.palette.primary.join(', ')}`);\n        if (rules.palette.secondary) {\n          instructions.push(`Secondary colors: ${rules.palette.secondary.join(', ')}`);\n        }\n      }\n      if (rules.minContrast) {\n        instructions.push(`Maintain minimum contrast ratio of ${rules.minContrast}:1 for accessibility`);\n      }\n      if (rules.allowedColors) {\n        instructions.push(`Only use these colors: ${rules.allowedColors.join(', ')}`);\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      if (rules.palette) {\n        instructions.push(`COLOR_PALETTE: ${JSON.stringify(rules.palette)}`);\n      }\n      if (rules.minContrast) {\n        instructions.push(`MIN_CONTRAST: ${rules.minContrast}`);\n      }\n      if (rules.maxColors) {\n        instructions.push(`MAX_COLORS: ${rules.maxColors}`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate typography instructions\n   */\n  private generateTypographyInstructions(\n    constraint: TypographyConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.fontFamilies) {\n        if (rules.fontFamilies.heading) {\n          instructions.push(`Use ${rules.fontFamilies.heading.join(' or ')} for headings`);\n        }\n        if (rules.fontFamilies.body) {\n          instructions.push(`Use ${rules.fontFamilies.body.join(' or ')} for body text`);\n        }\n      }\n      if (rules.scale) {\n        instructions.push(`Typography scale: base ${rules.scale.baseSize}px with ${rules.scale.ratio} ratio`);\n      }\n      if (rules.maxLevels) {\n        instructions.push(`Maximum ${rules.maxLevels} heading levels`);\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      if (rules.fontFamilies) {\n        instructions.push(`FONT_FAMILIES: ${JSON.stringify(rules.fontFamilies)}`);\n      }\n      if (rules.scale) {\n        instructions.push(`TYPOGRAPHY_SCALE: ${JSON.stringify(rules.scale)}`);\n      }\n      if (rules.weights) {\n        instructions.push(`FONT_WEIGHTS: ${rules.weights.join(', ')}`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate component instructions\n   */\n  private generateComponentInstructions(\n    constraint: ComponentConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.allowedComponents) {\n        instructions.push(`Only use these components: ${rules.allowedComponents.join(', ')}`);\n      }\n      if (rules.forbiddenComponents) {\n        instructions.push(`Do not use: ${rules.forbiddenComponents.join(', ')}`);\n      }\n      if (rules.maxNestingLevel) {\n        instructions.push(`Maximum nesting depth: ${rules.maxNestingLevel} levels`);\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      if (rules.allowedComponents) {\n        instructions.push(`ALLOWED_COMPONENTS: ${rules.allowedComponents.join(', ')}`);\n      }\n      if (rules.sizes) {\n        instructions.push(`COMPONENT_SIZES: ${JSON.stringify(rules.sizes)}`);\n      }\n      if (rules.variants) {\n        instructions.push(`VARIANTS: ${rules.variants.join(', ')}`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate accessibility instructions\n   */\n  private generateAccessibilityInstructions(\n    constraint: AccessibilityConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.wcagLevel) {\n        instructions.push(`Follow WCAG ${rules.wcagLevel} accessibility standards`);\n      }\n      if (rules.requireAltText) {\n        instructions.push('All images must have descriptive alt text');\n      }\n      if (rules.requireAriaLabels) {\n        instructions.push('Interactive elements must have ARIA labels');\n      }\n      if (rules.keyboardNavigable) {\n        instructions.push('Ensure all interactive elements are keyboard navigable');\n      }\n      if (rules.minTouchTarget) {\n        instructions.push(`Minimum touch target size: ${rules.minTouchTarget}px`);\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      instructions.push(`WCAG_LEVEL: ${rules.wcagLevel || 'AA'}`);\n      if (rules.minContrast) {\n        instructions.push(`MIN_CONTRAST: ${rules.minContrast}`);\n      }\n      if (rules.minTouchTarget) {\n        instructions.push(`MIN_TOUCH_TARGET: ${rules.minTouchTarget}px`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate spacing instructions\n   */\n  private generateSpacingInstructions(\n    constraint: SpacingConstraint,\n    format: string\n  ): string[] {\n    const instructions: string[] = [];\n    const { rules } = constraint;\n\n    if (format === 'natural' || format === 'mixed') {\n      if (rules.system) {\n        instructions.push(`Use ${rules.system.base}px base spacing with scale: ${rules.system.scale?.join(', ')}`);\n      }\n      if (rules.consistent) {\n        instructions.push('Maintain consistent spacing throughout the design');\n      }\n    }\n\n    if (format === 'structured' || format === 'mixed') {\n      if (rules.system) {\n        instructions.push(`SPACING_SYSTEM: ${JSON.stringify(rules.system)}`);\n      }\n      if (rules.minSpacing) {\n        instructions.push(`MIN_SPACING: ${rules.minSpacing}px`);\n      }\n      if (rules.maxSpacing) {\n        instructions.push(`MAX_SPACING: ${rules.maxSpacing}px`);\n      }\n    }\n\n    return instructions;\n  }\n\n  /**\n   * Generate custom instructions\n   */\n  private generateCustomInstructions(\n    constraint: CustomConstraint,\n    format: string\n  ): string[] {\n    if (constraint.promptGenerator) {\n      return constraint.promptGenerator(constraint.rules);\n    }\n\n    return [\n      format === 'structured'\n        ? `CUSTOM: ${JSON.stringify(constraint.rules)}`\n        : constraint.description || 'Apply custom constraint',\n    ];\n  }\n\n  /**\n   * Validate design output against constraints\n   */\n  public validateOutput(design: DesignOutput): ValidationResult {\n    const issues: ValidationIssue[] = [];\n    let totalConstraints = 0;\n    let passedConstraints = 0;\n\n    const enabledConstraints = Array.from(this.constraints.values()).filter((c) => c.enabled);\n\n    for (const constraint of enabledConstraints) {\n      totalConstraints++;\n      const constraintIssues = this.validateConstraint(constraint, design);\n\n      if (constraintIssues.length === 0) {\n        passedConstraints++;\n      } else {\n        issues.push(...constraintIssues);\n      }\n    }\n\n    // Evaluate conditional constraints\n    for (const conditional of this.conditionalConstraints) {\n      if (this.evaluateCondition(conditional.condition, design)) {\n        for (const constraint of conditional.thenConstraints) {\n          totalConstraints++;\n          const constraintIssues = this.validateConstraint(constraint, design);\n          if (constraintIssues.length === 0) {\n            passedConstraints++;\n          } else {\n            issues.push(...constraintIssues);\n          }\n        }\n      } else if (conditional.elseConstraints) {\n        for (const constraint of conditional.elseConstraints) {\n          totalConstraints++;\n          const constraintIssues = this.validateConstraint(constraint, design);\n          if (constraintIssues.length === 0) {\n            passedConstraints++;\n          } else {\n            issues.push(...constraintIssues);\n          }\n        }\n      }\n    }\n\n    const failedConstraints = totalConstraints - passedConstraints;\n    const warnings = issues.filter((i) => i.severity === ValidationSeverity.WARNING).length;\n    const score = totalConstraints > 0 ? (passedConstraints / totalConstraints) * 100 : 100;\n    const valid = this.config.strict ? issues.length === 0 : failedConstraints === 0;\n\n    return {\n      valid,\n      score: Math.round(score * 100) / 100,\n      issues,\n      summary: {\n        total: totalConstraints,\n        passed: passedConstraints,\n        failed: failedConstraints,\n        warnings,\n      },\n    };\n  }\n\n  /**\n   * Validate a single constraint\n   */\n  private validateConstraint(constraint: Constraint, design: DesignOutput): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n\n    switch (constraint.type) {\n      case ConstraintType.LAYOUT:\n        issues.push(...this.validateLayoutConstraint(constraint, design));\n        break;\n      case ConstraintType.COLOR:\n        issues.push(...this.validateColorConstraint(constraint, design));\n        break;\n      case ConstraintType.TYPOGRAPHY:\n        issues.push(...this.validateTypographyConstraint(constraint, design));\n        break;\n      case ConstraintType.COMPONENT:\n        issues.push(...this.validateComponentConstraint(constraint, design));\n        break;\n      case ConstraintType.ACCESSIBILITY:\n        issues.push(...this.validateAccessibilityConstraint(constraint, design));\n        break;\n      case ConstraintType.SPACING:\n        issues.push(...this.validateSpacingConstraint(constraint, design));\n        break;\n      case ConstraintType.CUSTOM:\n        issues.push(...this.validateCustomConstraint(constraint, design));\n        break;\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate layout constraint\n   */\n  private validateLayoutConstraint(\n    constraint: LayoutConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const { rules } = constraint;\n\n    if (rules.gridColumns && design.layout) {\n      const layout = design.layout as { columns?: number };\n      if (layout.columns) {\n        const expected = typeof rules.gridColumns === 'number'\n          ? rules.gridColumns\n          : { min: rules.gridColumns.min, max: rules.gridColumns.max };\n\n        if (typeof expected === 'number' && layout.columns !== expected) {\n          issues.push({\n            constraintId: constraint.id,\n            constraintType: constraint.type,\n            severity: this.getSeverity(constraint.priority),\n            message: `Layout should have ${expected} columns`,\n            path: 'layout.columns',\n            expected,\n            actual: layout.columns,\n          });\n        } else if (typeof expected !== 'number') {\n          if (layout.columns < expected.min || layout.columns > expected.max) {\n            issues.push({\n              constraintId: constraint.id,\n              constraintType: constraint.type,\n              severity: this.getSeverity(constraint.priority),\n              message: `Layout columns should be between ${expected.min} and ${expected.max}`,\n              path: 'layout.columns',\n              expected,\n              actual: layout.columns,\n            });\n          }\n        }\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate color constraint\n   */\n  private validateColorConstraint(\n    constraint: ColorConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const { rules } = constraint;\n\n    if (rules.allowedColors && design.colors) {\n      const disallowedColors = design.colors.filter(\n        (color) => !rules.allowedColors!.includes(color)\n      );\n\n      if (disallowedColors.length > 0) {\n        issues.push({\n          constraintId: constraint.id,\n          constraintType: constraint.type,\n          severity: this.getSeverity(constraint.priority),\n          message: `Design uses disallowed colors: ${disallowedColors.join(', ')}`,\n          path: 'colors',\n          expected: rules.allowedColors,\n          actual: design.colors,\n        });\n      }\n    }\n\n    if (rules.maxColors && design.colors && design.colors.length > rules.maxColors) {\n      issues.push({\n        constraintId: constraint.id,\n        constraintType: constraint.type,\n        severity: this.getSeverity(constraint.priority),\n        message: `Design uses too many colors (${design.colors.length} > ${rules.maxColors})`,\n        path: 'colors',\n        expected: rules.maxColors,\n        actual: design.colors.length,\n      });\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate typography constraint\n   */\n  private validateTypographyConstraint(\n    constraint: TypographyConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const { rules } = constraint;\n\n    if (rules.fontFamilies && design.typography) {\n      const typography = design.typography as { fontFamily?: string };\n      if (typography.fontFamily) {\n        const allAllowedFonts = [\n          ...(rules.fontFamilies.body || []),\n          ...(rules.fontFamilies.heading || []),\n          ...(rules.fontFamilies.monospace || []),\n        ];\n\n        if (!allAllowedFonts.some((font) => typography.fontFamily?.includes(font))) {\n          issues.push({\n            constraintId: constraint.id,\n            constraintType: constraint.type,\n            severity: this.getSeverity(constraint.priority),\n            message: 'Font family not in allowed list',\n            path: 'typography.fontFamily',\n            expected: allAllowedFonts,\n            actual: typography.fontFamily,\n          });\n        }\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate component constraint\n   */\n  private validateComponentConstraint(\n    constraint: ComponentConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const { rules } = constraint;\n\n    if (rules.allowedComponents && design.components) {\n      const components = design.components as Array<{ type: string }>;\n      const disallowedComponents = components.filter(\n        (comp) => !rules.allowedComponents!.includes(comp.type)\n      );\n\n      if (disallowedComponents.length > 0) {\n        issues.push({\n          constraintId: constraint.id,\n          constraintType: constraint.type,\n          severity: this.getSeverity(constraint.priority),\n          message: `Design uses disallowed components: ${disallowedComponents.map((c) => c.type).join(', ')}`,\n          path: 'components',\n          expected: rules.allowedComponents,\n          actual: disallowedComponents.map((c) => c.type),\n        });\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate accessibility constraint\n   */\n  private validateAccessibilityConstraint(\n    constraint: AccessibilityConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    const { rules } = constraint;\n\n    if (rules.requireAltText && design.components) {\n      const components = design.components as Array<{ type: string; alt?: string }>;\n      const imagesWithoutAlt = components.filter(\n        (comp) => comp.type === 'image' && !comp.alt\n      );\n\n      if (imagesWithoutAlt.length > 0) {\n        issues.push({\n          constraintId: constraint.id,\n          constraintType: constraint.type,\n          severity: ValidationSeverity.ERROR,\n          message: `${imagesWithoutAlt.length} images missing alt text`,\n          path: 'components',\n          suggestion: 'Add descriptive alt text to all images',\n        });\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Validate spacing constraint\n   */\n  private validateSpacingConstraint(\n    _constraint: SpacingConstraint,\n    _design: DesignOutput\n  ): ValidationIssue[] {\n    const issues: ValidationIssue[] = [];\n    // Spacing validation would require deep inspection of styles\n    // This is a simplified example\n    return issues;\n  }\n\n  /**\n   * Validate custom constraint\n   */\n  private validateCustomConstraint(\n    constraint: CustomConstraint,\n    design: DesignOutput\n  ): ValidationIssue[] {\n    if (constraint.validator) {\n      const result = constraint.validator(design);\n      return result.issues;\n    }\n    return [];\n  }\n\n  /**\n   * Merge constraints from another set\n   */\n  public merge(other: DesignConstraints, options: MergeOptions = { strategy: ConflictStrategy.MERGE }): DesignConstraints {\n    const mergedConfig: ConstraintSetConfig = {\n      name: `${this.config.name} + ${other.config.name}`,\n      description: `Merged from ${this.config.name} and ${other.config.name}`,\n      constraints: [],\n      conditionalConstraints: [\n        ...this.conditionalConstraints,\n        ...(other.conditionalConstraints || []),\n      ],\n    };\n\n    const mergedConstraints = new Map<string, Constraint>(this.constraints);\n\n    for (const [id, constraint] of Array.from(other.constraints)) {\n      if (mergedConstraints.has(id)) {\n        // Handle conflict\n        const existing = mergedConstraints.get(id)!;\n        const resolved = this.resolveConflict(existing, constraint, options.strategy);\n        mergedConstraints.set(id, resolved);\n      } else {\n        mergedConstraints.set(id, constraint);\n      }\n    }\n\n    mergedConfig.constraints = Array.from(mergedConstraints.values());\n\n    return new DesignConstraints(mergedConfig);\n  }\n\n  /**\n   * Extend base constraints\n   */\n  public extend(base: DesignConstraints): DesignConstraints {\n    const extendedConfig: ConstraintSetConfig = {\n      name: `${base.config.name} (Extended)`,\n      baseTemplate: base.config.name,\n      constraints: [\n        ...Array.from(base.constraints.values()),\n        ...Array.from(this.constraints.values()),\n      ],\n      conditionalConstraints: [\n        ...(base.conditionalConstraints || []),\n        ...this.conditionalConstraints,\n      ],\n    };\n\n    return new DesignConstraints(extendedConfig);\n  }\n\n  /**\n   * Get constraint by ID\n   */\n  public getConstraint(id: string): Constraint | undefined {\n    return this.constraints.get(id);\n  }\n\n  /**\n   * Get all constraints\n   */\n  public getAllConstraints(): Constraint[] {\n    return Array.from(this.constraints.values());\n  }\n\n  /**\n   * Get constraints by type\n   */\n  public getConstraintsByType(type: ConstraintType): Constraint[] {\n    return Array.from(this.constraints.values()).filter((c) => c.type === type);\n  }\n\n  /**\n   * Remove constraint\n   */\n  public removeConstraint(id: string): boolean {\n    return this.constraints.delete(id);\n  }\n\n  /**\n   * Enable/disable constraint\n   */\n  public setConstraintEnabled(id: string, enabled: boolean): void {\n    const constraint = this.constraints.get(id);\n    if (constraint) {\n      constraint.enabled = enabled;\n    }\n  }\n\n  /**\n   * Get constraint count\n   */\n  public getConstraintCount(): number {\n    return this.constraints.size;\n  }\n\n  /**\n   * Clear all constraints\n   */\n  public clear(): void {\n    this.constraints.clear();\n  }\n\n  // Helper methods\n\n  private groupByType(constraints: Constraint[]): Map<ConstraintType, Constraint[]> {\n    const grouped = new Map<ConstraintType, Constraint[]>();\n\n    for (const constraint of constraints) {\n      if (!grouped.has(constraint.type)) {\n        grouped.set(constraint.type, []);\n      }\n      grouped.get(constraint.type)!.push(constraint);\n    }\n\n    return grouped;\n  }\n\n  private getTypeSectionName(type: ConstraintType): string {\n    const names: Record<ConstraintType, string> = {\n      [ConstraintType.LAYOUT]: 'Layout Constraints',\n      [ConstraintType.COLOR]: 'Color Constraints',\n      [ConstraintType.TYPOGRAPHY]: 'Typography Constraints',\n      [ConstraintType.COMPONENT]: 'Component Constraints',\n      [ConstraintType.ACCESSIBILITY]: 'Accessibility Constraints',\n      [ConstraintType.SPACING]: 'Spacing Constraints',\n      [ConstraintType.SIZING]: 'Sizing Constraints',\n      [ConstraintType.ANIMATION]: 'Animation Constraints',\n      [ConstraintType.RESPONSIVE]: 'Responsive Constraints',\n      [ConstraintType.CUSTOM]: 'Custom Constraints',\n    };\n\n    return names[type];\n  }\n\n  private getHighestPriority(constraints: Constraint[]): ConstraintPriority {\n    const priorityOrder = [\n      ConstraintPriority.CRITICAL,\n      ConstraintPriority.HIGH,\n      ConstraintPriority.MEDIUM,\n      ConstraintPriority.LOW,\n    ];\n\n    for (const priority of priorityOrder) {\n      if (constraints.some((c) => c.priority === priority)) {\n        return priority;\n      }\n    }\n\n    return ConstraintPriority.MEDIUM;\n  }\n\n  private isPriorityAtLeast(priority: ConstraintPriority, threshold: ConstraintPriority): boolean {\n    const order = {\n      [ConstraintPriority.CRITICAL]: 4,\n      [ConstraintPriority.HIGH]: 3,\n      [ConstraintPriority.MEDIUM]: 2,\n      [ConstraintPriority.LOW]: 1,\n    };\n\n    return order[priority] >= order[threshold];\n  }\n\n  private getSeverity(priority: ConstraintPriority): ValidationSeverity {\n    const severityMap: Record<ConstraintPriority, ValidationSeverity> = {\n      [ConstraintPriority.CRITICAL]: ValidationSeverity.ERROR,\n      [ConstraintPriority.HIGH]: ValidationSeverity.ERROR,\n      [ConstraintPriority.MEDIUM]: ValidationSeverity.WARNING,\n      [ConstraintPriority.LOW]: ValidationSeverity.INFO,\n    };\n\n    return severityMap[priority];\n  }\n\n  private generateExamples(type: ConstraintType, _constraints: Constraint[]): string[] | undefined {\n    // Generate examples based on constraint type\n    const examples: string[] = [];\n\n    switch (type) {\n      case ConstraintType.LAYOUT:\n        examples.push('Example: <div className=\"grid grid-cols-12 gap-4\">');\n        break;\n      case ConstraintType.COLOR:\n        examples.push('Example: background-color: #3B82F6; color: #FFFFFF;');\n        break;\n      case ConstraintType.TYPOGRAPHY:\n        examples.push('Example: font-family: \"Inter\", sans-serif; font-size: 16px;');\n        break;\n    }\n\n    return examples.length > 0 ? examples : undefined;\n  }\n\n  private resolveConflict(\n    existing: Constraint,\n    incoming: Constraint,\n    strategy: ConflictStrategy\n  ): Constraint {\n    switch (strategy) {\n      case ConflictStrategy.OVERRIDE:\n        return incoming;\n      case ConflictStrategy.MERGE:\n        return {\n          ...existing,\n          rules: { ...existing.rules, ...incoming.rules } as any,\n          tags: [...(existing.tags || []), ...(incoming.tags || [])],\n          metadata: { ...existing.metadata, ...incoming.metadata },\n        } as Constraint;\n      case ConflictStrategy.PRIORITIZE:\n        return this.isPriorityAtLeast(incoming.priority, existing.priority)\n          ? incoming\n          : existing;\n      case ConflictStrategy.IGNORE_DUPLICATES:\n        return existing;\n      case ConflictStrategy.STRICT:\n        throw new Error(`Conflict detected for constraint ${existing.id}`);\n      default:\n        return existing;\n    }\n  }\n\n  private evaluateCondition(\n    condition: ConditionalConstraint['condition'],\n    design: DesignOutput\n  ): boolean {\n    const value = this.getValueByPath(design, condition.property);\n\n    switch (condition.operator) {\n      case 'equals':\n        return value === condition.value;\n      case 'notEquals':\n        return value !== condition.value;\n      case 'contains':\n        return Array.isArray(value) && value.includes(condition.value);\n      case 'greaterThan':\n        return typeof value === 'number' && typeof condition.value === 'number' && value > condition.value;\n      case 'lessThan':\n        return typeof value === 'number' && typeof condition.value === 'number' && value < condition.value;\n      case 'matches':\n        return typeof value === 'string' && typeof condition.value === 'string' && new RegExp(condition.value).test(value);\n      default:\n        return false;\n    }\n  }\n\n  private getValueByPath(obj: unknown, path: string): unknown {\n    const parts = path.split('.');\n    let current: unknown = obj;\n\n    for (const part of parts) {\n      if (current && typeof current === 'object' && part in current) {\n        current = (current as Record<string, unknown>)[part];\n      } else {\n        return undefined;\n      }\n    }\n\n    return current;\n  }\n}\n","/**\n * Design Constraint Templates\n *\n * Pre-built constraint templates for common design systems and frameworks\n */\n\nimport { DesignConstraints } from './DesignConstraints';\nimport {\n  ConstraintSetConfig,\n  ConstraintPriority,\n  LayoutSystem,\n  ColorFormat,\n  WCAGLevel,\n  ConstraintTemplate,\n} from './types';\n\n/**\n * Material Design 3 constraint template\n */\nexport function createMaterialDesignTemplate(): DesignConstraints {\n  const config: ConstraintSetConfig = {\n    name: 'Material Design 3',\n    description: 'Google Material Design 3 design system constraints',\n    constraints: [],\n  };\n\n  const constraints = new DesignConstraints(config);\n\n  // Layout constraints\n  constraints.defineLayoutConstraint(\n    'material-layout',\n    {\n      system: [LayoutSystem.GRID, LayoutSystem.FLEXBOX],\n      gridColumns: 12,\n      gridGap: '16px',\n      maxWidth: '1200px',\n    },\n    {\n      name: 'Material Layout',\n      description: 'Material Design 3 layout system with 12-column grid',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Color constraints\n  constraints.defineColorConstraint(\n    'material-color',\n    {\n      palette: {\n        primary: ['#6750A4', '#7F67BE', '#9A82DB', '#B69DF8'],\n        secondary: ['#625B71', '#7A7289', '#958DA5', '#B0A7C0'],\n        accent: ['#7D5260', '#986977', '#B58392', '#D29DAC'],\n        neutral: ['#1C1B1F', '#49454F', '#79747E', '#CAC4D0', '#E6E1E5', '#F4EFF4', '#FFFBFE'],\n        semantic: {\n          success: ['#006E1C', '#4C8400', '#6D9900'],\n          warning: ['#7D5700', '#9F6A00', '#C47F00'],\n          error: ['#BA1A1A', '#DE3730', '#FF5449'],\n          info: ['#0061A4', '#0078C9', '#5491F5'],\n        },\n      },\n      formats: [ColorFormat.HEX, ColorFormat.RGB],\n      minContrast: 4.5,\n      colorHarmony: ['analogous', 'complementary'],\n    },\n    {\n      name: 'Material Color System',\n      description: 'Material Design 3 color palette with dynamic color',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Typography constraints\n  constraints.defineTypographyConstraint(\n    'material-typography',\n    {\n      fontFamilies: {\n        heading: ['Roboto', 'sans-serif'],\n        body: ['Roboto', 'sans-serif'],\n        monospace: ['Roboto Mono', 'monospace'],\n      },\n      scale: {\n        baseSize: 16,\n        ratio: 1.25,\n        sizes: {\n          xs: 11,\n          sm: 12,\n          base: 14,\n          lg: 16,\n          xl: 22,\n          '2xl': 28,\n          '3xl': 36,\n          '4xl': 45,\n        },\n      },\n      weights: [400, 500, 700],\n      lineHeights: {\n        tight: 1.2,\n        normal: 1.5,\n        relaxed: 1.75,\n      },\n      maxLevels: 6,\n    },\n    {\n      name: 'Material Typography',\n      description: 'Material Design 3 type scale',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Component constraints\n  constraints.defineComponentConstraint(\n    'material-components',\n    {\n      sizes: {\n        sm: { height: '32px', padding: '8px 16px' },\n        md: { height: '40px', padding: '10px 24px' },\n        lg: { height: '56px', padding: '16px 32px' },\n      },\n      variants: ['filled', 'outlined', 'text', 'elevated', 'tonal'],\n      maxNestingLevel: 5,\n    },\n    {\n      name: 'Material Components',\n      description: 'Material Design 3 component system',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Spacing constraints\n  constraints.defineSpacingConstraint(\n    'material-spacing',\n    {\n      system: {\n        base: 8,\n        scale: [4, 8, 12, 16, 24, 32, 40, 48, 56, 64],\n      },\n      consistent: true,\n    },\n    {\n      name: 'Material Spacing',\n      description: '8px base spacing system',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Accessibility constraints\n  constraints.defineAccessibilityConstraint(\n    'material-a11y',\n    {\n      wcagLevel: WCAGLevel.AA,\n      minContrast: 4.5,\n      requireAltText: true,\n      requireAriaLabels: true,\n      keyboardNavigable: true,\n      focusVisible: true,\n      minTouchTarget: 48,\n    },\n    {\n      name: 'Material Accessibility',\n      description: 'WCAG AA compliance requirements',\n      priority: ConstraintPriority.CRITICAL,\n    }\n  );\n\n  return constraints;\n}\n\n/**\n * iOS Human Interface Guidelines template\n */\nexport function createiOSTemplate(): DesignConstraints {\n  const config: ConstraintSetConfig = {\n    name: 'iOS Human Interface Guidelines',\n    description: 'Apple iOS design system constraints',\n    constraints: [],\n  };\n\n  const constraints = new DesignConstraints(config);\n\n  // Layout constraints\n  constraints.defineLayoutConstraint(\n    'ios-layout',\n    {\n      system: [LayoutSystem.STACK, LayoutSystem.GRID],\n      maxWidth: '428px',\n      minWidth: '320px',\n    },\n    {\n      name: 'iOS Layout',\n      description: 'iOS adaptive layout system',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Color constraints\n  constraints.defineColorConstraint(\n    'ios-color',\n    {\n      palette: {\n        primary: ['#007AFF', '#0A84FF', '#5E5CE6'],\n        secondary: ['#5856D6', '#AF52DE', '#BF5AF2'],\n        accent: ['#FF9500', '#FF9F0A', '#FFD60A'],\n        neutral: ['#000000', '#1C1C1E', '#2C2C2E', '#3A3A3C', '#48484A', '#636366', '#8E8E93', '#AEAEB2', '#C7C7CC', '#D1D1D6', '#E5E5EA', '#F2F2F7', '#FFFFFF'],\n        semantic: {\n          success: ['#34C759', '#32D74B', '#30DB5B'],\n          warning: ['#FF9500', '#FF9F0A', '#FFD60A'],\n          error: ['#FF3B30', '#FF453A', '#FF6961'],\n          info: ['#007AFF', '#0A84FF', '#64D2FF'],\n        },\n      },\n      formats: [ColorFormat.HEX, ColorFormat.RGB],\n      minContrast: 4.5,\n    },\n    {\n      name: 'iOS Color System',\n      description: 'iOS system colors with dark mode support',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Typography constraints\n  constraints.defineTypographyConstraint(\n    'ios-typography',\n    {\n      fontFamilies: {\n        heading: ['SF Pro Display', '-apple-system', 'BlinkMacSystemFont', 'sans-serif'],\n        body: ['SF Pro Text', '-apple-system', 'BlinkMacSystemFont', 'sans-serif'],\n        monospace: ['SF Mono', 'Menlo', 'Monaco', 'monospace'],\n      },\n      scale: {\n        baseSize: 17,\n        ratio: 1.17,\n        sizes: {\n          xs: 11,\n          sm: 13,\n          base: 17,\n          lg: 20,\n          xl: 28,\n          '2xl': 34,\n          '3xl': 48,\n        },\n      },\n      weights: [400, 600, 700],\n      lineHeights: {\n        tight: 1.2,\n        normal: 1.4,\n        relaxed: 1.6,\n      },\n    },\n    {\n      name: 'iOS Typography',\n      description: 'San Francisco font system',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Component constraints\n  constraints.defineComponentConstraint(\n    'ios-components',\n    {\n      sizes: {\n        sm: { height: '36px', padding: '8px 12px' },\n        md: { height: '44px', padding: '10px 16px' },\n        lg: { height: '50px', padding: '12px 20px' },\n      },\n      variants: ['filled', 'plain', 'gray', 'tinted'],\n      maxNestingLevel: 4,\n    },\n    {\n      name: 'iOS Components',\n      description: 'iOS UIKit components',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Spacing constraints\n  constraints.defineSpacingConstraint(\n    'ios-spacing',\n    {\n      system: {\n        base: 8,\n        scale: [4, 8, 16, 20, 24, 32],\n      },\n      consistent: true,\n    },\n    {\n      name: 'iOS Spacing',\n      description: '8px base spacing system',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Accessibility constraints\n  constraints.defineAccessibilityConstraint(\n    'ios-a11y',\n    {\n      wcagLevel: WCAGLevel.AA,\n      minContrast: 4.5,\n      requireAltText: true,\n      requireAriaLabels: true,\n      keyboardNavigable: true,\n      focusVisible: true,\n      minTouchTarget: 44,\n    },\n    {\n      name: 'iOS Accessibility',\n      description: 'iOS accessibility requirements',\n      priority: ConstraintPriority.CRITICAL,\n    }\n  );\n\n  return constraints;\n}\n\n/**\n * Tailwind CSS template\n */\nexport function createTailwindTemplate(): DesignConstraints {\n  const config: ConstraintSetConfig = {\n    name: 'Tailwind CSS',\n    description: 'Tailwind CSS utility-first design system',\n    constraints: [],\n  };\n\n  const constraints = new DesignConstraints(config);\n\n  // Layout constraints\n  constraints.defineLayoutConstraint(\n    'tailwind-layout',\n    {\n      system: [LayoutSystem.GRID, LayoutSystem.FLEXBOX],\n      gridColumns: 12,\n      gridGap: '1rem',\n    },\n    {\n      name: 'Tailwind Layout',\n      description: 'Tailwind responsive grid system',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Color constraints\n  constraints.defineColorConstraint(\n    'tailwind-color',\n    {\n      palette: {\n        primary: ['#3B82F6', '#2563EB', '#1D4ED8', '#1E40AF', '#1E3A8A'],\n        secondary: ['#6B7280', '#4B5563', '#374151', '#1F2937', '#111827'],\n        accent: ['#10B981', '#059669', '#047857', '#065F46', '#064E3B'],\n        neutral: ['#FFFFFF', '#F9FAFB', '#F3F4F6', '#E5E7EB', '#D1D5DB', '#9CA3AF', '#6B7280', '#4B5563', '#374151', '#1F2937', '#111827', '#000000'],\n      },\n      formats: [ColorFormat.HEX, ColorFormat.RGB, ColorFormat.RGBA],\n    },\n    {\n      name: 'Tailwind Colors',\n      description: 'Tailwind default color palette',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Typography constraints\n  constraints.defineTypographyConstraint(\n    'tailwind-typography',\n    {\n      fontFamilies: {\n        body: ['ui-sans-serif', 'system-ui', 'sans-serif'],\n        heading: ['ui-sans-serif', 'system-ui', 'sans-serif'],\n        monospace: ['ui-monospace', 'monospace'],\n      },\n      scale: {\n        baseSize: 16,\n        ratio: 1.25,\n        sizes: {\n          xs: 12,\n          sm: 14,\n          base: 16,\n          lg: 18,\n          xl: 20,\n          '2xl': 24,\n          '3xl': 30,\n          '4xl': 36,\n        },\n      },\n      weights: [400, 500, 600, 700, 800, 900],\n      lineHeights: {\n        tight: 1.25,\n        normal: 1.5,\n        relaxed: 1.625,\n        loose: 2,\n      },\n    },\n    {\n      name: 'Tailwind Typography',\n      description: 'Tailwind type scale',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Spacing constraints\n  constraints.defineSpacingConstraint(\n    'tailwind-spacing',\n    {\n      system: {\n        base: 4,\n        scale: [1, 2, 4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64],\n      },\n      consistent: true,\n    },\n    {\n      name: 'Tailwind Spacing',\n      description: '4px base spacing scale',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  return constraints;\n}\n\n/**\n * Bootstrap template\n */\nexport function createBootstrapTemplate(): DesignConstraints {\n  const config: ConstraintSetConfig = {\n    name: 'Bootstrap 5',\n    description: 'Bootstrap 5 responsive design system',\n    constraints: [],\n  };\n\n  const constraints = new DesignConstraints(config);\n\n  // Layout constraints\n  constraints.defineLayoutConstraint(\n    'bootstrap-layout',\n    {\n      system: [LayoutSystem.GRID, LayoutSystem.FLEXBOX],\n      gridColumns: 12,\n      gridGap: '1.5rem',\n      maxWidth: '1320px',\n    },\n    {\n      name: 'Bootstrap Layout',\n      description: 'Bootstrap 12-column responsive grid',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Color constraints\n  constraints.defineColorConstraint(\n    'bootstrap-color',\n    {\n      palette: {\n        primary: ['#0D6EFD'],\n        secondary: ['#6C757D'],\n        accent: ['#0DCAF0'],\n        semantic: {\n          success: ['#198754'],\n          warning: ['#FFC107'],\n          error: ['#DC3545'],\n          info: ['#0DCAF0'],\n        },\n      },\n      formats: [ColorFormat.HEX],\n    },\n    {\n      name: 'Bootstrap Colors',\n      description: 'Bootstrap theme colors',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Typography constraints\n  constraints.defineTypographyConstraint(\n    'bootstrap-typography',\n    {\n      fontFamilies: {\n        body: ['system-ui', '-apple-system', 'sans-serif'],\n        heading: ['system-ui', '-apple-system', 'sans-serif'],\n        monospace: ['SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'monospace'],\n      },\n      scale: {\n        baseSize: 16,\n        ratio: 1.25,\n      },\n      weights: [400, 700],\n    },\n    {\n      name: 'Bootstrap Typography',\n      description: 'Bootstrap type system',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Spacing constraints\n  constraints.defineSpacingConstraint(\n    'bootstrap-spacing',\n    {\n      system: {\n        base: 16,\n        scale: [4, 8, 16, 24, 48],\n      },\n    },\n    {\n      name: 'Bootstrap Spacing',\n      description: '16px base spacing utilities',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  return constraints;\n}\n\n/**\n * Minimal/Clean template\n */\nexport function createMinimalTemplate(): DesignConstraints {\n  const config: ConstraintSetConfig = {\n    name: 'Minimal Design',\n    description: 'Clean, minimal design constraints',\n    constraints: [],\n  };\n\n  const constraints = new DesignConstraints(config);\n\n  // Layout constraints\n  constraints.defineLayoutConstraint(\n    'minimal-layout',\n    {\n      system: [LayoutSystem.FLEXBOX, LayoutSystem.GRID],\n      maxWidth: '1000px',\n    },\n    {\n      name: 'Minimal Layout',\n      description: 'Simple, centered layout',\n      priority: ConstraintPriority.MEDIUM,\n    }\n  );\n\n  // Color constraints - monochromatic\n  constraints.defineColorConstraint(\n    'minimal-color',\n    {\n      palette: {\n        primary: ['#000000'],\n        neutral: ['#FFFFFF', '#F5F5F5', '#E0E0E0', '#BDBDBD', '#9E9E9E', '#757575', '#616161', '#424242', '#212121', '#000000'],\n      },\n      maxColors: 3,\n      colorHarmony: ['monochromatic'],\n    },\n    {\n      name: 'Minimal Colors',\n      description: 'Monochromatic grayscale palette',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Typography constraints\n  constraints.defineTypographyConstraint(\n    'minimal-typography',\n    {\n      fontFamilies: {\n        body: ['Helvetica Neue', 'Arial', 'sans-serif'],\n        heading: ['Helvetica Neue', 'Arial', 'sans-serif'],\n      },\n      scale: {\n        baseSize: 18,\n        ratio: 1.414,\n      },\n      weights: [400, 700],\n      maxLevels: 3,\n    },\n    {\n      name: 'Minimal Typography',\n      description: 'Simple type hierarchy',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  // Spacing constraints\n  constraints.defineSpacingConstraint(\n    'minimal-spacing',\n    {\n      system: {\n        base: 8,\n        scale: [8, 16, 32, 64],\n      },\n      consistent: true,\n    },\n    {\n      name: 'Minimal Spacing',\n      description: 'Generous white space',\n      priority: ConstraintPriority.HIGH,\n    }\n  );\n\n  return constraints;\n}\n\n/**\n * Template registry\n */\nexport const TEMPLATE_REGISTRY: Record<string, () => DesignConstraints> = {\n  'material': createMaterialDesignTemplate,\n  'ios': createiOSTemplate,\n  'tailwind': createTailwindTemplate,\n  'bootstrap': createBootstrapTemplate,\n  'minimal': createMinimalTemplate,\n};\n\n/**\n * Get available template names\n */\nexport function getAvailableTemplates(): string[] {\n  return Object.keys(TEMPLATE_REGISTRY);\n}\n\n/**\n * Create constraints from template\n */\nexport function createFromTemplate(templateName: string): DesignConstraints | null {\n  const factory = TEMPLATE_REGISTRY[templateName];\n  return factory ? factory() : null;\n}\n\n/**\n * Export template metadata\n */\nexport function getTemplateMetadata(): ConstraintTemplate[] {\n  return [\n    {\n      id: 'material',\n      name: 'Material Design 3',\n      description: 'Google Material Design 3 design system',\n      category: 'Design System',\n      version: '3.0',\n      author: 'Google',\n      constraints: createMaterialDesignTemplate().getAllConstraints(),\n    },\n    {\n      id: 'ios',\n      name: 'iOS Human Interface Guidelines',\n      description: 'Apple iOS design system',\n      category: 'Design System',\n      version: 'iOS 17',\n      author: 'Apple',\n      constraints: createiOSTemplate().getAllConstraints(),\n    },\n    {\n      id: 'tailwind',\n      name: 'Tailwind CSS',\n      description: 'Utility-first CSS framework',\n      category: 'CSS Framework',\n      version: '3.0',\n      constraints: createTailwindTemplate().getAllConstraints(),\n    },\n    {\n      id: 'bootstrap',\n      name: 'Bootstrap 5',\n      description: 'Popular responsive framework',\n      category: 'CSS Framework',\n      version: '5.0',\n      constraints: createBootstrapTemplate().getAllConstraints(),\n    },\n    {\n      id: 'minimal',\n      name: 'Minimal Design',\n      description: 'Clean and minimal aesthetic',\n      category: 'Style',\n      version: '1.0',\n      constraints: createMinimalTemplate().getAllConstraints(),\n    },\n  ];\n}\n"]}