{"version":3,"sources":["../src/types/utils.ts","../src/streaming/AIStream.ts","../src/streaming/token-counter.ts","../src/agents/types.ts","../src/agents/Agent.ts","../src/utils/id.ts","../src/agents/llm/LLMProvider.ts","../src/agents/llm/OpenAIProvider.ts","../src/agents/llm/AnthropicProvider.ts","../src/agents/AgentExecutor.ts","../src/agents/StreamingAgentExecutor.ts","../src/agents/AgentSwarm.ts","../src/store/ConversationStore.ts","../src/store/MemoryStore.ts","../src/store/ZeroDBStore.ts","../src/store/RedisStore.ts","../src/store/createStore.ts","../src/context/types.ts","../src/context/TokenCounter.ts","../src/context/ContextManager.ts","../src/summarization/extractive.ts","../src/summarization/ConversationSummarizer.ts","../src/memory/MemoryStore.ts","../src/memory/InMemoryMemoryStore.ts","../src/memory/ZeroDBMemoryStore.ts","../src/memory/FactExtractor.ts","../src/memory/UserMemory.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/zerodb/QueryBuilder.ts","../src/zerodb/ZeroDBClient.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/search/SemanticSearch.ts","../src/design/DesignConstraints.ts","../src/utils/RateLimiter.ts"],"names":["EventEmitter","MessageImportance","result","MemoryStore","pipeline","AuthMethod","AuthStatus","StorageStrategy","AuthErrorType","AuthEventType","fs","DEFAULT_CONFIG","i","path","MemoryStorage"],"mappings":"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","file":"browser.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 * 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 * AIKIT Agent - Base Agent Class\n *\n * This module provides the base Agent class with tool registration,\n * validation, and management capabilities.\n */\n\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport {\n  AgentConfig,\n  ToolDefinition,\n  ToolRegistry,\n  ToolCall,\n  ToolResult,\n  Message,\n  AgentError,\n  ToolValidationError,\n} from './types';\n\n/**\n * Base Agent class that manages tools and provides execution context\n */\nexport class Agent {\n  /**\n   * Agent configuration\n   */\n  public readonly config: AgentConfig;\n\n  /**\n   * Tool registry (name -> definition)\n   */\n  private toolRegistry: ToolRegistry;\n\n  constructor(config: AgentConfig) {\n    this.config = config;\n    this.toolRegistry = new Map();\n\n    // Register provided tools\n    if (config.tools && config.tools.length > 0) {\n      config.tools.forEach((tool) => this.registerTool(tool));\n    }\n  }\n\n  /**\n   * Register a tool with the agent\n   */\n  public registerTool(tool: ToolDefinition): void {\n    // Validate tool definition\n    this.validateToolDefinition(tool);\n\n    // Check for duplicate tool names\n    if (this.toolRegistry.has(tool.name)) {\n      throw new AgentError(\n        `Tool with name \"${tool.name}\" is already registered`,\n        'DUPLICATE_TOOL_NAME',\n        { toolName: tool.name }\n      );\n    }\n\n    this.toolRegistry.set(tool.name, tool);\n  }\n\n  /**\n   * Register multiple tools at once\n   */\n  public registerTools(tools: ToolDefinition[]): void {\n    tools.forEach((tool) => this.registerTool(tool));\n  }\n\n  /**\n   * Unregister a tool by name\n   */\n  public unregisterTool(toolName: string): boolean {\n    return this.toolRegistry.delete(toolName);\n  }\n\n  /**\n   * Get a tool by name\n   */\n  public getTool(toolName: string): ToolDefinition | undefined {\n    return this.toolRegistry.get(toolName);\n  }\n\n  /**\n   * Get all registered tools\n   */\n  public getTools(): ToolDefinition[] {\n    return Array.from(this.toolRegistry.values());\n  }\n\n  /**\n   * Check if a tool is registered\n   */\n  public hasTool(toolName: string): boolean {\n    return this.toolRegistry.has(toolName);\n  }\n\n  /**\n   * Get tool names for LLM function calling\n   */\n  public getToolSchemas(): Array<{\n    name: string;\n    description: string;\n    parameters: Record<string, unknown>;\n  }> {\n    return this.getTools().map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      parameters: this.zodSchemaToJsonSchema(tool.parameters),\n    }));\n  }\n\n  /**\n   * Validate tool call parameters against the tool's schema\n   */\n  public validateToolCall(toolCall: ToolCall): {\n    valid: boolean;\n    error?: ToolValidationError;\n    validatedParams?: unknown;\n  } {\n    const tool = this.toolRegistry.get(toolCall.name);\n\n    if (!tool) {\n      return {\n        valid: false,\n        error: new ToolValidationError(\n          `Tool \"${toolCall.name}\" not found`,\n          toolCall.name,\n          new z.ZodError([\n            {\n              code: 'custom',\n              path: [],\n              message: `Tool \"${toolCall.name}\" not found`,\n            },\n          ])\n        ),\n      };\n    }\n\n    try {\n      const validatedParams = tool.parameters.parse(toolCall.parameters);\n      return { valid: true, validatedParams };\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        return {\n          valid: false,\n          error: new ToolValidationError(\n            `Invalid parameters for tool \"${toolCall.name}\"`,\n            toolCall.name,\n            error,\n            { parameters: toolCall.parameters }\n          ),\n        };\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Execute a single tool call\n   */\n  public async executeToolCall(toolCall: ToolCall): Promise<ToolResult> {\n    const startTime = Date.now();\n    const tool = this.toolRegistry.get(toolCall.name);\n\n    if (!tool) {\n      return {\n        toolCallId: toolCall.id,\n        toolName: toolCall.name,\n        result: null,\n        error: {\n          message: `Tool \"${toolCall.name}\" not found`,\n          code: 'TOOL_NOT_FOUND',\n        },\n        metadata: {\n          durationMs: Date.now() - startTime,\n          timestamp: new Date().toISOString(),\n        },\n      };\n    }\n\n    // Validate parameters\n    const validation = this.validateToolCall(toolCall);\n    if (!validation.valid) {\n      return {\n        toolCallId: toolCall.id,\n        toolName: toolCall.name,\n        result: null,\n        error: {\n          message: validation.error!.message,\n          code: 'VALIDATION_ERROR',\n          stack: validation.error!.stack,\n        },\n        metadata: {\n          durationMs: Date.now() - startTime,\n          timestamp: new Date().toISOString(),\n        },\n      };\n    }\n\n    // Execute with retry logic\n    const maxAttempts = tool.retry?.maxAttempts ?? 1;\n    const backoffMs = tool.retry?.backoffMs ?? 1000;\n    let lastError: Error | null = null;\n\n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      try {\n        // Execute with timeout if specified\n        const result = tool.timeoutMs\n          ? await this.executeWithTimeout(\n              () => tool.execute(validation.validatedParams),\n              tool.timeoutMs\n            )\n          : await tool.execute(validation.validatedParams);\n\n        return {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          result,\n          metadata: {\n            durationMs: Date.now() - startTime,\n            timestamp: new Date().toISOString(),\n            retryCount: attempt,\n          },\n        };\n      } catch (error) {\n        lastError = error as Error;\n\n        // If this isn't the last attempt, wait before retrying\n        if (attempt < maxAttempts - 1) {\n          await this.sleep(backoffMs * (attempt + 1));\n        }\n      }\n    }\n\n    // All attempts failed\n    return {\n      toolCallId: toolCall.id,\n      toolName: toolCall.name,\n      result: null,\n      error: {\n        message: lastError?.message ?? 'Unknown error',\n        code: 'EXECUTION_ERROR',\n        stack: lastError?.stack,\n      },\n      metadata: {\n        durationMs: Date.now() - startTime,\n        timestamp: new Date().toISOString(),\n        retryCount: maxAttempts - 1,\n      },\n    };\n  }\n\n  /**\n   * Execute multiple tool calls in parallel\n   */\n  public async executeToolCalls(toolCalls: ToolCall[]): Promise<ToolResult[]> {\n    return Promise.all(toolCalls.map((tc) => this.executeToolCall(tc)));\n  }\n\n  /**\n   * Build initial messages for the agent\n   */\n  public buildInitialMessages(userMessage: string): Message[] {\n    const messages: Message[] = [];\n\n    // Add system prompt\n    if (this.config.systemPrompt) {\n      messages.push({\n        role: 'system',\n        content: this.config.systemPrompt,\n        timestamp: new Date().toISOString(),\n      });\n    }\n\n    // Add user message\n    messages.push({\n      role: 'user',\n      content: userMessage,\n      timestamp: new Date().toISOString(),\n    });\n\n    return messages;\n  }\n\n  /**\n   * Get agent metadata for logging/tracing\n   */\n  public getMetadata(): Record<string, unknown> {\n    return {\n      id: this.config.id,\n      name: this.config.name,\n      description: this.config.description,\n      llm: {\n        provider: this.config.llm.provider,\n        model: this.config.llm.model,\n      },\n      toolCount: this.toolRegistry.size,\n      toolNames: Array.from(this.toolRegistry.keys()),\n      maxSteps: this.config.maxSteps,\n      streaming: this.config.streaming,\n      ...this.config.metadata,\n    };\n  }\n\n  // ============================================================================\n  // Private Helper Methods\n  // ============================================================================\n\n  /**\n   * Validate tool definition structure\n   */\n  private validateToolDefinition(tool: ToolDefinition): void {\n    if (!tool.name || typeof tool.name !== 'string') {\n      throw new AgentError(\n        'Tool name is required and must be a string',\n        'INVALID_TOOL_DEFINITION'\n      );\n    }\n\n    if (!tool.description || typeof tool.description !== 'string') {\n      throw new AgentError(\n        'Tool description is required and must be a string',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n\n    if (!tool.parameters || !(tool.parameters instanceof z.ZodType)) {\n      throw new AgentError(\n        'Tool parameters must be a valid Zod schema',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n\n    if (!tool.execute || typeof tool.execute !== 'function') {\n      throw new AgentError(\n        'Tool execute must be a function',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n  }\n\n  /**\n   * Convert Zod schema to JSON schema for LLM function calling\n   */\n  private zodSchemaToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n    try {\n      // Use zod-to-json-schema library for complete, accurate conversion\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const jsonSchema = zodToJsonSchema(schema as any, {\n        target: 'openApi3',           // OpenAI-compatible format\n        $refStrategy: 'none',          // Inline all schemas (no $ref)\n        strictUnions: false,           // More permissive union handling\n        errorMessages: false,          // Exclude error messages from schema\n        markdownDescription: false,    // Use 'description' not 'markdownDescription'\n        dateStrategy: 'string',        // Convert dates to ISO strings\n        emailStrategy: 'format:email', // Use 'format: email' for z.email()\n        base64Strategy: 'contentEncoding:base64', // Base64 handling\n      }) as any;\n\n      // Remove $schema property as it's not needed for LLM function calling\n      if (jsonSchema.$schema) {\n        delete jsonSchema.$schema;\n      }\n\n      return jsonSchema as Record<string, unknown>;\n    } catch (error) {\n      console.warn('Failed to convert Zod schema to JSON schema:', error);\n      // Fallback to basic object schema\n      return {\n        type: 'object',\n        properties: {},\n        additionalProperties: true\n      };\n    }\n  }\n\n\n  /**\n   * Execute a function with timeout\n   */\n  private async executeWithTimeout<T>(\n    fn: () => Promise<T>,\n    timeoutMs: number\n  ): Promise<T> {\n    return Promise.race([\n      fn(),\n      new Promise<T>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(`Timeout after ${timeoutMs}ms`)),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n\n  /**\n   * Sleep for specified milliseconds\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n\n/**\n * Factory function to create an agent\n */\nexport function createAgent(config: AgentConfig): Agent {\n  return new Agent(config);\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 * 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 * 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 * AIKIT AgentExecutor - Multi-Step Agent Execution Engine\n *\n * This module implements the core agent execution loop with tool calling,\n * streaming support, error handling, and detailed execution tracing.\n */\n\nimport { Agent } from './Agent';\nimport {\n  AgentState,\n  Message,\n  ToolResult,\n  ExecutionTrace,\n  TraceEvent,\n  StreamCallback,\n  StreamEvent,\n  MaxStepsExceededError,\n  LLMError,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\nimport { LLMProvider } from './llm/LLMProvider';\nimport { OpenAIProvider } from './llm/OpenAIProvider';\nimport { AnthropicProvider } from './llm/AnthropicProvider';\n\n/**\n * Configuration for agent execution\n */\nexport interface ExecutionConfig {\n  /**\n   * Maximum number of steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Whether to enable streaming\n   */\n  streaming?: boolean;\n\n  /**\n   * Stream callback for real-time updates\n   */\n  onStream?: StreamCallback;\n\n  /**\n   * Whether to include detailed traces\n   */\n  verbose?: boolean;\n\n  /**\n   * Custom LLM provider instance\n   */\n  llmProvider?: LLMProvider;\n\n  /**\n   * Additional context to include in execution\n   */\n  context?: Record<string, unknown>;\n}\n\n/**\n * Result of agent execution\n */\nexport interface ExecutionResult {\n  /**\n   * Final response from the agent\n   */\n  response: string;\n\n  /**\n   * Final agent state\n   */\n  state: AgentState;\n\n  /**\n   * Complete execution trace\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/**\n * AgentExecutor - Orchestrates multi-step agent execution with tool calling\n */\nexport class AgentExecutor {\n  private agent: Agent;\n  private llmProvider: LLMProvider;\n  private executionId: string;\n  private trace: ExecutionTrace;\n  private state: AgentState;\n  private defaultConfig: ExecutionConfig;\n\n  constructor(agent: Agent, config?: ExecutionConfig) {\n    this.agent = agent;\n    this.executionId = generateId('exec');\n    this.defaultConfig = config ?? {};\n\n    // Initialize LLM provider\n    if (config?.llmProvider) {\n      this.llmProvider = config.llmProvider;\n    } else {\n      this.llmProvider = this.createLLMProvider(agent.config.llm);\n    }\n\n    // Initialize trace\n    this.trace = {\n      executionId: this.executionId,\n      agentId: agent.config.id,\n      startTime: new Date().toISOString(),\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n\n    // Initialize state\n    this.state = {\n      step: 0,\n      messages: [],\n      pendingToolCalls: [],\n      toolResults: [],\n      isComplete: false,\n    };\n  }\n\n  /**\n   * Execute the agent with the given input\n   */\n  public async execute(\n    input: string,\n    config?: ExecutionConfig\n  ): Promise<ExecutionResult> {\n    const startTime = Date.now();\n\n    try {\n      // Add trace event for agent start\n      this.addTraceEvent({\n        type: 'agent_start',\n        timestamp: new Date().toISOString(),\n        data: {\n          input,\n          agentId: this.agent.config.id,\n          config,\n        },\n      });\n\n      // Emit stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'start',\n        timestamp: new Date().toISOString(),\n        data: { input },\n      });\n\n      // Build initial messages\n      this.state.messages = this.agent.buildInitialMessages(input);\n\n      // Execute the main loop\n      const maxSteps = config?.maxSteps ?? this.defaultConfig.maxSteps ?? this.agent.config.maxSteps ?? 10;\n      await this.executionLoop(maxSteps, config);\n\n      // Calculate final stats\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      // Add trace event for agent end\n      this.addTraceEvent({\n        type: 'agent_end',\n        timestamp: new Date().toISOString(),\n        data: {\n          success: !this.state.error,\n          finalResponse: this.state.finalResponse,\n        },\n        durationMs: this.trace.durationMs,\n      });\n\n      // Emit completion stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'complete',\n        timestamp: new Date().toISOString(),\n        data: {\n          response: this.state.finalResponse ?? '',\n          trace: this.trace,\n        },\n      });\n\n      return {\n        response: this.state.finalResponse ?? '',\n        state: this.state,\n        trace: this.trace,\n        success: !this.state.error,\n        error: this.state.error\n          ? new Error(this.state.error.message)\n          : undefined,\n      };\n    } catch (error) {\n      // Handle unexpected errors\n      const errorObj = error as Error;\n      this.state.error = {\n        message: errorObj.message,\n        step: this.state.step,\n        cause: error,\n      };\n\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      this.addTraceEvent({\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: {\n          error: errorObj.message,\n          stack: errorObj.stack,\n        },\n      });\n\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: { error: errorObj.message },\n      });\n\n      return {\n        response: '',\n        state: this.state,\n        trace: this.trace,\n        success: false,\n        error: errorObj,\n      };\n    }\n  }\n\n  /**\n   * Main execution loop\n   */\n  private async executionLoop(\n    maxSteps: number,\n    config?: ExecutionConfig\n  ): Promise<void> {\n    while (this.state.step < maxSteps && !this.state.isComplete) {\n      // Only increment step counter for LLM reasoning steps, not for tool execution\n      const isToolExecutionStep = this.state.pendingToolCalls.length > 0;\n      if (!isToolExecutionStep) {\n        this.state.step++;\n        this.trace.stats.totalSteps++;\n      }\n\n      // Add step start trace event\n      this.addTraceEvent({\n        type: 'step_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      });\n\n      // Emit step stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'step',\n        timestamp: new Date().toISOString(),\n        data: { step: this.state.step },\n      });\n\n      try {\n        // If there are pending tool calls, execute them\n        if (isToolExecutionStep) {\n          await this.executeToolCallsStep(config);\n        } else {\n          // Otherwise, get next response from LLM\n          await this.llmStep(config);\n        }\n      } catch (error) {\n        const errorObj = error as Error;\n\n        // Check if it's a MaxStepsExceededError\n        if (error instanceof MaxStepsExceededError) {\n          throw error;\n        }\n\n        // Log error in trace but continue if possible\n        this.addTraceEvent({\n          type: 'error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n        });\n\n        // If it's a critical error, stop execution\n        if (error instanceof LLMError) {\n          this.state.error = {\n            message: errorObj.message,\n            step: this.state.step,\n            cause: error,\n          };\n          this.state.isComplete = true;\n          break;\n        }\n\n        // For tool errors, we can continue\n        continue;\n      }\n\n      // Add step end trace event\n      this.addTraceEvent({\n        type: 'step_end',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          isComplete: this.state.isComplete,\n        },\n      });\n    }\n\n    // Check if we exceeded max steps\n    if (this.state.step >= maxSteps && !this.state.isComplete) {\n      throw new MaxStepsExceededError(maxSteps, {\n        executionId: this.executionId,\n        step: this.state.step,\n      });\n    }\n  }\n\n  /**\n   * Execute LLM step to get next response\n   */\n  private async llmStep(config?: ExecutionConfig): Promise<void> {\n    const startTime = Date.now();\n\n    // Add LLM request trace event\n    this.addTraceEvent({\n      type: 'llm_request',\n      timestamp: new Date().toISOString(),\n      step: this.state.step,\n      data: {\n        messagesCount: this.state.messages.length,\n        tools: this.agent.getToolSchemas(),\n      },\n    });\n\n    this.trace.stats.totalLLMCalls++;\n\n    try {\n      // Call LLM provider\n      const response = await this.llmProvider.chat({\n        messages: this.state.messages,\n        tools: this.agent.getToolSchemas(),\n        streaming: config?.streaming,\n        onStream: config?.streaming\n          ? async (chunk) => {\n              await this.emitStreamEvent(config.onStream, {\n                type: 'text_chunk',\n                timestamp: new Date().toISOString(),\n                data: chunk,\n              });\n            }\n          : undefined,\n      });\n\n      // Add LLM response trace event\n      this.addTraceEvent({\n        type: 'llm_response',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          content: response.content,\n          toolCalls: response.toolCalls,\n          finishReason: response.finishReason,\n        },\n        durationMs: Date.now() - startTime,\n      });\n\n      // Add assistant message to conversation\n      const assistantMessage: Message = {\n        role: 'assistant',\n        content: response.content,\n        toolCalls: response.toolCalls,\n        timestamp: new Date().toISOString(),\n      };\n      this.state.messages.push(assistantMessage);\n\n      // Check if LLM wants to call tools\n      if (response.toolCalls && response.toolCalls.length > 0) {\n        this.state.pendingToolCalls = response.toolCalls;\n        this.trace.stats.totalToolCalls += response.toolCalls.length;\n\n        // Emit tool call events\n        for (const toolCall of response.toolCalls) {\n          await this.emitStreamEvent(config?.onStream, {\n            type: 'tool_call',\n            timestamp: new Date().toISOString(),\n            data: { toolCall },\n          });\n        }\n      } else {\n        // No tool calls - execution is complete\n        this.state.isComplete = true;\n        this.state.finalResponse = response.content;\n      }\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `LLM call failed: ${errorObj.message}`,\n        this.agent.config.llm.provider,\n        {\n          step: this.state.step,\n          messagesCount: this.state.messages.length,\n        }\n      );\n    }\n  }\n\n  /**\n   * Execute pending tool calls\n   */\n  private async executeToolCallsStep(config?: ExecutionConfig): Promise<void> {\n    const toolCalls = this.state.pendingToolCalls;\n    this.state.pendingToolCalls = [];\n\n    const results: ToolResult[] = [];\n\n    for (const toolCall of toolCalls) {\n      const startTime = Date.now();\n\n      // Add tool call start trace event\n      this.addTraceEvent({\n        type: 'tool_call_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          parameters: toolCall.parameters,\n        },\n      });\n\n      try {\n        // Execute tool\n        const result = await this.agent.executeToolCall(toolCall);\n        results.push(result);\n\n        // Update stats\n        if (result.error) {\n          this.trace.stats.failedToolCalls++;\n\n          // Add tool error trace event\n          this.addTraceEvent({\n            type: 'tool_call_error',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              error: result.error,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        } else {\n          this.trace.stats.successfulToolCalls++;\n\n          // Add tool call end trace event\n          this.addTraceEvent({\n            type: 'tool_call_end',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              result: result.result,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        }\n\n        // Emit tool result stream event\n        await this.emitStreamEvent(config?.onStream, {\n          type: 'tool_result',\n          timestamp: new Date().toISOString(),\n          data: { result },\n        });\n\n        // Add tool result message to conversation\n        const toolMessage: Message = {\n          role: 'tool',\n          content: result.error\n            ? `Error: ${result.error.message}`\n            : JSON.stringify(result.result),\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(toolMessage);\n        this.state.toolResults.push(result);\n      } catch (error) {\n        const errorObj = error as Error;\n        this.trace.stats.failedToolCalls++;\n\n        // Add tool error trace event\n        this.addTraceEvent({\n          type: 'tool_call_error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            toolCallId: toolCall.id,\n            toolName: toolCall.name,\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n          durationMs: Date.now() - startTime,\n        });\n\n        // Add error message to conversation\n        const errorMessage: Message = {\n          role: 'tool',\n          content: `Error: ${errorObj.message}`,\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(errorMessage);\n      }\n    }\n  }\n\n  /**\n   * Add an event to the execution trace\n   */\n  private addTraceEvent(event: TraceEvent): void {\n    this.trace.events.push(event);\n  }\n\n  /**\n   * Emit a stream event\n   */\n  private async emitStreamEvent(\n    callback: StreamCallback | undefined,\n    event: StreamEvent\n  ): Promise<void> {\n    if (callback) {\n      try {\n        await callback(event);\n      } catch (error) {\n        // Log but don't fail execution on stream errors\n        console.error('Stream callback error:', error);\n      }\n    }\n  }\n\n  /**\n   * Create LLM provider based on config\n   */\n  private createLLMProvider(llmConfig: any): LLMProvider {\n    switch (llmConfig.provider) {\n      case 'openai':\n        return new OpenAIProvider(llmConfig);\n      case 'anthropic':\n        return new AnthropicProvider(llmConfig);\n      default:\n        throw new AgentError(\n          `Unsupported LLM provider: ${llmConfig.provider}`,\n          'UNSUPPORTED_PROVIDER'\n        );\n    }\n  }\n\n  /**\n   * Get current execution trace\n   */\n  public getTrace(): ExecutionTrace {\n    return { ...this.trace };\n  }\n\n  /**\n   * Get current agent state\n   */\n  public getState(): AgentState {\n    return { ...this.state };\n  }\n}\n\n/**\n * Factory function to create and execute an agent in one call\n */\nexport async function executeAgent(\n  agent: Agent,\n  input: string,\n  config?: ExecutionConfig\n): Promise<ExecutionResult> {\n  const executor = new AgentExecutor(agent, config);\n  return executor.execute(input, config);\n}\n","/**\n * AIKIT StreamingAgentExecutor - Streaming Agent Execution with Async Iterators\n *\n * This module provides streaming execution capabilities for agents,\n * allowing real-time updates as the agent thinks, calls tools, and generates responses.\n */\n\nimport { Agent } from './Agent';\nimport {\n  AgentState,\n  Message,\n  ToolResult,\n  ExecutionTrace,\n  TraceEvent,\n  AgentExecutionEvent,\n  AgentStepEvent,\n  ThoughtEvent,\n  ToolCallEvent,\n  ToolResultEvent,\n  FinalAnswerEvent,\n  ErrorEvent,\n  MaxStepsExceededError,\n  LLMError,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\nimport { LLMProvider } from './llm/LLMProvider';\nimport { OpenAIProvider } from './llm/OpenAIProvider';\nimport { AnthropicProvider } from './llm/AnthropicProvider';\n\n/**\n * Configuration for streaming execution\n */\nexport interface StreamingExecutionConfig {\n  /**\n   * Maximum number of steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Custom LLM provider instance\n   */\n  llmProvider?: LLMProvider;\n\n  /**\n   * Whether to include detailed traces\n   */\n  verbose?: boolean;\n\n  /**\n   * Additional context to include in execution\n   */\n  context?: Record<string, unknown>;\n}\n\n/**\n * Complete streaming execution result\n */\nexport interface StreamingExecutionResult {\n  /**\n   * Final response from the agent\n   */\n  response: string;\n\n  /**\n   * Final agent state\n   */\n  state: AgentState;\n\n  /**\n   * Complete execution trace\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/**\n * StreamingAgentExecutor - Provides async iterator-based streaming execution\n *\n * Usage:\n * ```typescript\n * const executor = new StreamingAgentExecutor(agent);\n * for await (const event of executor.stream(input)) {\n *   if (event.type === 'thought') {\n *     console.log('Agent thinking:', event.content);\n *   } else if (event.type === 'tool_call') {\n *     console.log('Calling tool:', event.toolCall.name);\n *   } else if (event.type === 'final_answer') {\n *     console.log('Final answer:', event.answer);\n *   }\n * }\n * ```\n */\nexport class StreamingAgentExecutor {\n  private agent: Agent;\n  private llmProvider: LLMProvider;\n  private executionId: string;\n  private trace: ExecutionTrace;\n  private state: AgentState;\n\n  constructor(agent: Agent, config?: StreamingExecutionConfig) {\n    this.agent = agent;\n    this.executionId = generateId('exec');\n\n    // Initialize LLM provider\n    if (config?.llmProvider) {\n      this.llmProvider = config.llmProvider;\n    } else {\n      this.llmProvider = this.createLLMProvider(agent.config.llm);\n    }\n\n    // Initialize trace\n    this.trace = {\n      executionId: this.executionId,\n      agentId: agent.config.id,\n      startTime: new Date().toISOString(),\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n\n    // Initialize state\n    this.state = {\n      step: 0,\n      messages: [],\n      pendingToolCalls: [],\n      toolResults: [],\n      isComplete: false,\n    };\n  }\n\n  /**\n   * Stream agent execution as an async iterator\n   * Yields events as the agent progresses through execution\n   */\n  async *stream(\n    input: string,\n    config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, StreamingExecutionResult, undefined> {\n    const startTime = Date.now();\n\n    try {\n      // Add trace event for agent start\n      this.addTraceEvent({\n        type: 'agent_start',\n        timestamp: new Date().toISOString(),\n        data: {\n          input,\n          agentId: this.agent.config.id,\n          config,\n        },\n      });\n\n      // Build initial messages\n      this.state.messages = this.agent.buildInitialMessages(input);\n\n      // Execute the main loop\n      const maxSteps = config?.maxSteps ?? this.agent.config.maxSteps ?? 10;\n\n      // Execute the streaming loop\n      yield* this.executionStreamLoop(maxSteps, config);\n\n      // Calculate final stats\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      // Add trace event for agent end\n      this.addTraceEvent({\n        type: 'agent_end',\n        timestamp: new Date().toISOString(),\n        data: {\n          success: !this.state.error,\n          finalResponse: this.state.finalResponse,\n        },\n        durationMs: this.trace.durationMs,\n      });\n\n      return {\n        response: this.state.finalResponse ?? '',\n        state: this.state,\n        trace: this.trace,\n        success: !this.state.error,\n        error: this.state.error\n          ? new Error(this.state.error.message)\n          : undefined,\n      };\n    } catch (error) {\n      // Handle unexpected errors\n      const errorObj = error as Error;\n\n      // Re-throw MaxStepsExceededError - this is an expected constraint violation\n      if (error instanceof MaxStepsExceededError) {\n        throw error;\n      }\n\n      this.state.error = {\n        message: errorObj.message,\n        step: this.state.step,\n        cause: error,\n      };\n\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      this.addTraceEvent({\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: {\n          error: errorObj.message,\n          stack: errorObj.stack,\n        },\n      });\n\n      // Yield error event\n      const errorEvent: ErrorEvent = {\n        type: 'error',\n        error: errorObj.message,\n        code:\n          error instanceof AgentError\n            ? error.code\n            : 'UNKNOWN_ERROR',\n        step: this.state.step,\n        timestamp: new Date().toISOString(),\n      };\n      yield errorEvent;\n\n      return {\n        response: '',\n        state: this.state,\n        trace: this.trace,\n        success: false,\n        error: errorObj,\n      };\n    }\n  }\n\n  /**\n   * Main streaming execution loop\n   */\n  private async *executionStreamLoop(\n    maxSteps: number,\n    config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    while (this.state.step < maxSteps && !this.state.isComplete) {\n      this.state.step++;\n      this.trace.stats.totalSteps++;\n\n      // Add step start trace event\n      this.addTraceEvent({\n        type: 'step_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      });\n\n      // Emit step event\n      const stepEvent: AgentStepEvent = {\n        type: 'step',\n        step: this.state.step,\n        timestamp: new Date().toISOString(),\n        metadata: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      };\n      yield stepEvent;\n\n      try {\n        // If there are pending tool calls, execute them\n        if (this.state.pendingToolCalls.length > 0) {\n          yield* this.executeToolCallsStreamStep(config);\n        } else {\n          // Otherwise, get next response from LLM\n          yield* this.llmStreamStep(config);\n        }\n      } catch (error) {\n        const errorObj = error as Error;\n\n        // Check if it's a MaxStepsExceededError\n        if (error instanceof MaxStepsExceededError) {\n          throw error;\n        }\n\n        // Log error in trace\n        this.addTraceEvent({\n          type: 'error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n        });\n\n        // Yield error event\n        const errorEvent: ErrorEvent = {\n          type: 'error',\n          error: errorObj.message,\n          code:\n            error instanceof AgentError\n              ? error.code\n              : 'UNKNOWN_ERROR',\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield errorEvent;\n\n        // If it's a critical error, stop execution\n        if (error instanceof LLMError) {\n          this.state.error = {\n            message: errorObj.message,\n            step: this.state.step,\n            cause: error,\n          };\n          this.state.isComplete = true;\n          break;\n        }\n\n        // For tool errors, we can continue\n        continue;\n      }\n\n      // Add step end trace event\n      this.addTraceEvent({\n        type: 'step_end',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          isComplete: this.state.isComplete,\n        },\n      });\n    }\n\n    // Check if we exceeded max steps\n    if (this.state.step >= maxSteps && !this.state.isComplete) {\n      throw new MaxStepsExceededError(maxSteps, {\n        executionId: this.executionId,\n        step: this.state.step,\n      });\n    }\n  }\n\n  /**\n   * Execute LLM step and stream thoughts\n   */\n  private async *llmStreamStep(\n    _config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    const startTime = Date.now();\n\n    // Add LLM request trace event\n    this.addTraceEvent({\n      type: 'llm_request',\n      timestamp: new Date().toISOString(),\n      step: this.state.step,\n      data: {\n        messagesCount: this.state.messages.length,\n        tools: this.agent.getToolSchemas(),\n      },\n    });\n\n    this.trace.stats.totalLLMCalls++;\n\n    try {\n      // Call LLM provider\n      const response = await this.llmProvider.chat({\n        messages: this.state.messages,\n        tools: this.agent.getToolSchemas(),\n        streaming: false, // We handle our own streaming of events\n      });\n\n      // Add LLM response trace event\n      this.addTraceEvent({\n        type: 'llm_response',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          content: response.content,\n          toolCalls: response.toolCalls,\n          finishReason: response.finishReason,\n        },\n        durationMs: Date.now() - startTime,\n      });\n\n      // If there's content, yield it as a thought event\n      if (response.content && response.content.trim()) {\n        const thoughtEvent: ThoughtEvent = {\n          type: 'thought',\n          content: response.content,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield thoughtEvent;\n      }\n\n      // Add assistant message to conversation\n      const assistantMessage: Message = {\n        role: 'assistant',\n        content: response.content,\n        toolCalls: response.toolCalls,\n        timestamp: new Date().toISOString(),\n      };\n      this.state.messages.push(assistantMessage);\n\n      // Check if LLM wants to call tools\n      if (response.toolCalls && response.toolCalls.length > 0) {\n        this.state.pendingToolCalls = response.toolCalls;\n        this.trace.stats.totalToolCalls += response.toolCalls.length;\n\n        // Yield tool call events\n        for (const toolCall of response.toolCalls) {\n          const toolCallEvent: ToolCallEvent = {\n            type: 'tool_call',\n            toolCall,\n            step: this.state.step,\n            timestamp: new Date().toISOString(),\n          };\n          yield toolCallEvent;\n        }\n      } else {\n        // No tool calls - execution is complete\n        this.state.isComplete = true;\n        this.state.finalResponse = response.content;\n\n        // Yield final answer event\n        const finalAnswerEvent: FinalAnswerEvent = {\n          type: 'final_answer',\n          answer: response.content,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield finalAnswerEvent;\n      }\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `LLM call failed: ${errorObj.message}`,\n        this.agent.config.llm.provider,\n        {\n          step: this.state.step,\n          messagesCount: this.state.messages.length,\n        }\n      );\n    }\n  }\n\n  /**\n   * Execute pending tool calls and stream results\n   */\n  private async *executeToolCallsStreamStep(\n    _config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    const toolCalls = this.state.pendingToolCalls;\n    this.state.pendingToolCalls = [];\n\n    for (const toolCall of toolCalls) {\n      const startTime = Date.now();\n\n      // Add tool call start trace event\n      this.addTraceEvent({\n        type: 'tool_call_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          parameters: toolCall.parameters,\n        },\n      });\n\n      try {\n        // Execute tool\n        const result = await this.agent.executeToolCall(toolCall);\n\n        // Update stats\n        if (result.error) {\n          this.trace.stats.failedToolCalls++;\n\n          // Add tool error trace event\n          this.addTraceEvent({\n            type: 'tool_call_error',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              error: result.error,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        } else {\n          this.trace.stats.successfulToolCalls++;\n\n          // Add tool call end trace event\n          this.addTraceEvent({\n            type: 'tool_call_end',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              result: result.result,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        }\n\n        // Yield tool result event\n        const toolResultEvent: ToolResultEvent = {\n          type: 'tool_result',\n          result,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield toolResultEvent;\n\n        // Add tool result message to conversation\n        const toolMessage: Message = {\n          role: 'tool',\n          content: result.error\n            ? `Error: ${result.error.message}`\n            : JSON.stringify(result.result),\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(toolMessage);\n        this.state.toolResults.push(result);\n      } catch (error) {\n        const errorObj = error as Error;\n        this.trace.stats.failedToolCalls++;\n\n        // Add tool error trace event\n        this.addTraceEvent({\n          type: 'tool_call_error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            toolCallId: toolCall.id,\n            toolName: toolCall.name,\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n          durationMs: Date.now() - startTime,\n        });\n\n        // Create error result\n        const errorResult: ToolResult = {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          result: null,\n          error: {\n            message: errorObj.message,\n            code: 'EXECUTION_ERROR',\n            stack: errorObj.stack,\n          },\n          metadata: {\n            durationMs: Date.now() - startTime,\n            timestamp: new Date().toISOString(),\n          },\n        };\n\n        // Yield tool result event with error\n        const toolResultEvent: ToolResultEvent = {\n          type: 'tool_result',\n          result: errorResult,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield toolResultEvent;\n\n        // Add error message to conversation\n        const errorMessage: Message = {\n          role: 'tool',\n          content: `Error: ${errorObj.message}`,\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(errorMessage);\n      }\n    }\n  }\n\n  /**\n   * Add an event to the execution trace\n   */\n  private addTraceEvent(event: TraceEvent): void {\n    this.trace.events.push(event);\n  }\n\n  /**\n   * Create LLM provider based on config\n   */\n  private createLLMProvider(llmConfig: any): LLMProvider {\n    switch (llmConfig.provider) {\n      case 'openai':\n        return new OpenAIProvider(llmConfig);\n      case 'anthropic':\n        return new AnthropicProvider(llmConfig);\n      default:\n        throw new AgentError(\n          `Unsupported LLM provider: ${llmConfig.provider}`,\n          'UNSUPPORTED_PROVIDER'\n        );\n    }\n  }\n\n  /**\n   * Get current execution trace\n   */\n  public getTrace(): ExecutionTrace {\n    return { ...this.trace };\n  }\n\n  /**\n   * Get current agent state\n   */\n  public getState(): AgentState {\n    return { ...this.state };\n  }\n}\n\n/**\n * Factory function to create a streaming executor and iterate over events\n */\nexport async function* streamAgentExecution(\n  agent: Agent,\n  input: string,\n  config?: StreamingExecutionConfig\n): AsyncGenerator<AgentExecutionEvent, StreamingExecutionResult, undefined> {\n  const executor = new StreamingAgentExecutor(agent, config);\n  return yield* executor.stream(input, config);\n}\n","/**\n * AIKIT AgentSwarm - Multi-Agent Coordination System\n *\n * This module implements a swarm architecture where a supervisor agent\n * coordinates multiple specialist agents to handle complex tasks.\n */\n\nimport { EventEmitter } from 'events';\nimport { Agent } from './Agent';\nimport { AgentExecutor, ExecutionConfig, ExecutionResult } from './AgentExecutor';\nimport {\n  SwarmConfig,\n  SwarmResult,\n  SpecialistAgent,\n  SpecialistResult,\n  TaskRoutingDecision,\n  ExecutionTrace,\n  TraceEvent,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\n\n/**\n * Events emitted by the AgentSwarm\n */\nexport interface SwarmEvents {\n  'swarm:start': { input: string; timestamp: string };\n  'swarm:routing': { task: string; decision: TaskRoutingDecision };\n  'specialist:start': { specialistId: string; task: string };\n  'specialist:complete': { specialistId: string; result: SpecialistResult };\n  'specialist:error': { specialistId: string; error: Error };\n  'swarm:synthesis': { results: SpecialistResult[] };\n  'swarm:complete': { result: SwarmResult };\n  'swarm:error': { error: Error };\n}\n\n/**\n * AgentSwarm - Coordinates multiple specialist agents under a supervisor\n */\nexport class AgentSwarm extends EventEmitter {\n  /**\n   * Swarm configuration\n   */\n  public readonly config: SwarmConfig;\n\n  /**\n   * Supervisor agent\n   */\n  private supervisor: Agent;\n\n  /**\n   * Map of specialist agents\n   */\n  private specialists: Map<string, SpecialistAgent>;\n\n  /**\n   * Execution ID for the current swarm execution\n   */\n  private executionId?: string;\n\n  constructor(config: SwarmConfig) {\n    super();\n    this.validateConfig(config);\n    this.config = config;\n    this.supervisor = config.supervisor;\n    this.specialists = new Map();\n\n    // Register all specialists\n    config.specialists.forEach((specialist) => {\n      this.registerSpecialist(specialist);\n    });\n  }\n\n  /**\n   * Register a new specialist agent\n   */\n  public registerSpecialist(specialist: SpecialistAgent): void {\n    // Validate specialist configuration\n    if (!specialist.id || typeof specialist.id !== 'string') {\n      throw new AgentError(\n        'Specialist ID is required and must be a string',\n        'INVALID_SPECIALIST_CONFIG'\n      );\n    }\n\n    if (!specialist.agent) {\n      throw new AgentError(\n        `Specialist ${specialist.id} must have an agent instance`,\n        'INVALID_SPECIALIST_CONFIG',\n        { specialistId: specialist.id }\n      );\n    }\n\n    if (!specialist.specialization || typeof specialist.specialization !== 'string') {\n      throw new AgentError(\n        `Specialist ${specialist.id} must have a specialization`,\n        'INVALID_SPECIALIST_CONFIG',\n        { specialistId: specialist.id }\n      );\n    }\n\n    // Check for duplicate specialist IDs\n    if (this.specialists.has(specialist.id)) {\n      throw new AgentError(\n        `Specialist with ID \"${specialist.id}\" is already registered`,\n        'DUPLICATE_SPECIALIST_ID',\n        { specialistId: specialist.id }\n      );\n    }\n\n    this.specialists.set(specialist.id, specialist);\n  }\n\n  /**\n   * Unregister a specialist agent\n   */\n  public unregisterSpecialist(specialistId: string): boolean {\n    return this.specialists.delete(specialistId);\n  }\n\n  /**\n   * Get a specialist by ID\n   */\n  public getSpecialist(specialistId: string): SpecialistAgent | undefined {\n    return this.specialists.get(specialistId);\n  }\n\n  /**\n   * Get all registered specialists\n   */\n  public getSpecialists(): SpecialistAgent[] {\n    return Array.from(this.specialists.values());\n  }\n\n  /**\n   * Execute the swarm with the given task\n   */\n  public async execute(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<SwarmResult> {\n    this.executionId = generateId('swarm');\n    const startTime = Date.now();\n\n    // Emit start event\n    this.emit('swarm:start', {\n      input: task,\n      timestamp: new Date().toISOString(),\n    });\n\n    try {\n      // Step 1: Use supervisor to analyze and route the task\n      const routingDecisions = await this.routeTask(task, config);\n\n      // Step 2: Execute specialists based on routing decisions\n      const specialistResults = await this.executeSpecialists(\n        task,\n        routingDecisions,\n        config\n      );\n\n      // Step 3: Synthesize results from all specialists\n      const synthesizedResponse = await this.synthesizeResults(\n        task,\n        specialistResults,\n        config\n      );\n\n      // Step 4: Build combined trace\n      const combinedTrace = this.buildCombinedTrace(\n        specialistResults,\n        startTime\n      );\n\n      // Build final result\n      const result: SwarmResult = {\n        response: synthesizedResponse,\n        specialistResults,\n        combinedTrace,\n        supervisorTrace: this.getSupervisorTrace(routingDecisions),\n        success: specialistResults.every((r) => r.success),\n        stats: {\n          totalSpecialistsInvoked: specialistResults.length,\n          successfulSpecialists: specialistResults.filter((r) => r.success).length,\n          failedSpecialists: specialistResults.filter((r) => !r.success).length,\n          totalDurationMs: Date.now() - startTime,\n          parallelExecutions: this.config.parallelExecution ? specialistResults.length : 0,\n        },\n      };\n\n      // Emit complete event\n      this.emit('swarm:complete', { result });\n\n      return result;\n    } catch (error) {\n      const errorObj = error as Error;\n\n      // Emit error event\n      this.emit('swarm:error', { error: errorObj });\n\n      // Return error result\n      return {\n        response: '',\n        specialistResults: [],\n        combinedTrace: this.buildEmptyTrace(startTime),\n        supervisorTrace: this.buildEmptyTrace(startTime),\n        success: false,\n        error: errorObj,\n        stats: {\n          totalSpecialistsInvoked: 0,\n          successfulSpecialists: 0,\n          failedSpecialists: 0,\n          totalDurationMs: Date.now() - startTime,\n          parallelExecutions: 0,\n        },\n      };\n    }\n  }\n\n  /**\n   * Route the task to appropriate specialists\n   */\n  private async routeTask(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<TaskRoutingDecision[]> {\n    // Use custom router if provided\n    if (this.config.customRouter) {\n      const decision = await this.config.customRouter(\n        task,\n        Array.from(this.specialists.values())\n      );\n      this.emit('swarm:routing', { task, decision });\n      return [decision];\n    }\n\n    // Default routing: keyword-based matching\n    const matchedSpecialists = this.matchSpecialistsByKeywords(task);\n\n    if (matchedSpecialists.length === 0) {\n      // If no keywords match, ask supervisor to decide\n      return this.supervisorRouting(task, config);\n    }\n\n    // Sort by priority and return routing decisions\n    const sortedSpecialists = matchedSpecialists.sort(\n      (a, b) => (b.priority ?? 0) - (a.priority ?? 0)\n    );\n\n    const decisions: TaskRoutingDecision[] = sortedSpecialists.map((specialist) => ({\n      specialistId: specialist.id,\n      reason: `Matched keywords: ${specialist.keywords?.join(', ')}`,\n      confidence: 0.8,\n    }));\n\n    // Emit routing events\n    decisions.forEach((decision) => {\n      this.emit('swarm:routing', { task, decision });\n    });\n\n    return decisions;\n  }\n\n  /**\n   * Match specialists based on keywords in the task\n   */\n  private matchSpecialistsByKeywords(task: string): SpecialistAgent[] {\n    const taskLower = task.toLowerCase();\n    const matched: SpecialistAgent[] = [];\n\n    this.specialists.forEach((specialist) => {\n      if (specialist.keywords && specialist.keywords.length > 0) {\n        const hasMatch = specialist.keywords.some((keyword) =>\n          taskLower.includes(keyword.toLowerCase())\n        );\n        if (hasMatch) {\n          matched.push(specialist);\n        }\n      }\n    });\n\n    return matched;\n  }\n\n  /**\n   * Use supervisor agent to route the task\n   */\n  private async supervisorRouting(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<TaskRoutingDecision[]> {\n    // Build prompt for supervisor\n    const specialistsList = Array.from(this.specialists.values())\n      .map(\n        (s) =>\n          `- ${s.id}: ${s.specialization} (keywords: ${s.keywords?.join(', ') || 'none'})`\n      )\n      .join('\\n');\n\n    const supervisorPrompt = `You are a supervisor agent coordinating a team of specialists.\n\nAvailable specialists:\n${specialistsList}\n\nTask: ${task}\n\nBased on this task, which specialist(s) should handle it? Respond with a JSON object containing:\n{\n  \"specialistId\": \"the ID of the specialist\",\n  \"reason\": \"why this specialist should handle the task\",\n  \"confidence\": 0.0-1.0\n}\n\nIf multiple specialists are needed, respond with a JSON array of such objects.`;\n\n    try {\n      const executor = new AgentExecutor(this.supervisor, config);\n      const result = await executor.execute(supervisorPrompt, config);\n\n      // Parse supervisor's response\n      const decisions = this.parseSupervisorResponse(result.response);\n\n      // Emit routing events\n      decisions.forEach((decision) => {\n        this.emit('swarm:routing', { task, decision });\n      });\n\n      return decisions;\n    } catch (error) {\n      // Fallback: use first available specialist\n      const firstSpecialist = Array.from(this.specialists.values())[0];\n      if (!firstSpecialist) {\n        throw new AgentError(\n          'No specialists available and supervisor routing failed',\n          'ROUTING_FAILED',\n          { originalError: error }\n        );\n      }\n\n      const fallbackDecision: TaskRoutingDecision = {\n        specialistId: firstSpecialist.id,\n        reason: 'Fallback to first available specialist',\n        confidence: 0.3,\n      };\n\n      this.emit('swarm:routing', { task, decision: fallbackDecision });\n      return [fallbackDecision];\n    }\n  }\n\n  /**\n   * Parse supervisor's routing response\n   */\n  private parseSupervisorResponse(response: string): TaskRoutingDecision[] {\n    try {\n      // Try to extract JSON from the response\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/);\n      if (!jsonMatch) {\n        throw new Error('No JSON found in response');\n      }\n\n      const parsed = JSON.parse(jsonMatch[0]);\n\n      // Handle single decision or array\n      const decisions = Array.isArray(parsed) ? parsed : [parsed];\n\n      // Validate decisions\n      return decisions\n        .filter((d) => d.specialistId && this.specialists.has(d.specialistId))\n        .map((d) => ({\n          specialistId: d.specialistId,\n          reason: d.reason || 'No reason provided',\n          confidence: d.confidence ?? 0.5,\n        }));\n    } catch (error) {\n      // Fallback: use first available specialist\n      const firstSpecialist = Array.from(this.specialists.values())[0];\n      if (!firstSpecialist) {\n        return [];\n      }\n\n      return [\n        {\n          specialistId: firstSpecialist.id,\n          reason: 'Failed to parse supervisor response, using fallback',\n          confidence: 0.2,\n        },\n      ];\n    }\n  }\n\n  /**\n   * Execute specialist agents based on routing decisions\n   */\n  private async executeSpecialists(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    if (decisions.length === 0) {\n      throw new AgentError(\n        'No routing decisions provided',\n        'NO_ROUTING_DECISIONS'\n      );\n    }\n\n    // Determine execution mode\n    const parallelExecution = this.config.parallelExecution ?? false;\n    const maxConcurrent = this.config.maxConcurrent ?? decisions.length;\n\n    if (parallelExecution) {\n      return this.executeSpecialistsParallel(task, decisions, maxConcurrent, config);\n    } else {\n      return this.executeSpecialistsSequential(task, decisions, config);\n    }\n  }\n\n  /**\n   * Execute specialists in parallel\n   */\n  private async executeSpecialistsParallel(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    maxConcurrent: number,\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    const results: SpecialistResult[] = [];\n    const executing: Promise<SpecialistResult>[] = [];\n\n    for (const decision of decisions) {\n      const promise = this.executeSpecialist(task, decision, config);\n      executing.push(promise);\n\n      // Limit concurrent executions\n      if (executing.length >= maxConcurrent) {\n        const result = await Promise.race(executing);\n        results.push(result);\n        executing.splice(\n          executing.findIndex((p) => p === promise),\n          1\n        );\n      }\n    }\n\n    // Wait for remaining executions\n    const remaining = await Promise.all(executing);\n    results.push(...remaining);\n\n    return results;\n  }\n\n  /**\n   * Execute specialists sequentially\n   */\n  private async executeSpecialistsSequential(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    const results: SpecialistResult[] = [];\n\n    for (const decision of decisions) {\n      const result = await this.executeSpecialist(task, decision, config);\n      results.push(result);\n    }\n\n    return results;\n  }\n\n  /**\n   * Execute a single specialist\n   */\n  private async executeSpecialist(\n    task: string,\n    decision: TaskRoutingDecision,\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult> {\n    const specialist = this.specialists.get(decision.specialistId);\n    if (!specialist) {\n      return this.buildErrorResult(\n        decision.specialistId,\n        'unknown',\n        new Error(`Specialist ${decision.specialistId} not found`)\n      );\n    }\n\n    const startTime = Date.now();\n\n    // Emit start event\n    this.emit('specialist:start', {\n      specialistId: specialist.id,\n      task,\n    });\n\n    try {\n      // Execute the specialist agent\n      const executor = new AgentExecutor(specialist.agent, config);\n\n      // Apply timeout if configured\n      const specialistConfig = {\n        ...config,\n        maxSteps: config?.maxSteps ?? 10,\n      };\n\n      const executionPromise = executor.execute(task, specialistConfig);\n\n      const result: ExecutionResult = this.config.specialistTimeoutMs\n        ? await this.executeWithTimeout(\n            executionPromise,\n            this.config.specialistTimeoutMs\n          )\n        : await executionPromise;\n\n      const specialistResult: SpecialistResult = {\n        specialistId: specialist.id,\n        specialization: specialist.specialization,\n        response: result.response,\n        trace: result.trace,\n        success: result.success,\n        error: result.error,\n        metadata: {\n          startTime: new Date(startTime).toISOString(),\n          endTime: new Date().toISOString(),\n          durationMs: Date.now() - startTime,\n        },\n      };\n\n      // Emit complete event\n      this.emit('specialist:complete', {\n        specialistId: specialist.id,\n        result: specialistResult,\n      });\n\n      return specialistResult;\n    } catch (error) {\n      const errorObj = error as Error;\n\n      // Emit error event\n      this.emit('specialist:error', {\n        specialistId: specialist.id,\n        error: errorObj,\n      });\n\n      return this.buildErrorResult(\n        specialist.id,\n        specialist.specialization,\n        errorObj,\n        startTime\n      );\n    }\n  }\n\n  /**\n   * Synthesize results from multiple specialists\n   */\n  private async synthesizeResults(\n    originalTask: string,\n    results: SpecialistResult[],\n    config?: ExecutionConfig\n  ): Promise<string> {\n    // Use custom synthesizer if provided\n    if (this.config.customSynthesizer) {\n      return this.config.customSynthesizer(results);\n    }\n\n    // If only one specialist, return its response directly\n    if (results.length === 1) {\n      return results[0]?.response ?? '';\n    }\n\n    // Emit synthesis event\n    this.emit('swarm:synthesis', { results });\n\n    // Default synthesis: combine all specialist responses\n    const combinedResponses = results\n      .map(\n        (r, i) =>\n          `### Specialist ${i + 1}: ${r.specialization}\\n${r.success ? r.response : `Error: ${r.error?.message}`}`\n      )\n      .join('\\n\\n');\n\n    // Use supervisor to synthesize the final response\n    const synthesisPrompt = `You are a supervisor agent. You delegated a complex task to specialists and received their responses.\n\nOriginal task: ${originalTask}\n\nSpecialist responses:\n${combinedResponses}\n\nPlease synthesize these responses into a single, coherent answer that addresses the original task.`;\n\n    try {\n      const executor = new AgentExecutor(this.supervisor, config);\n      const result = await executor.execute(synthesisPrompt, config);\n      return result.response;\n    } catch (error) {\n      // Fallback: return concatenated responses\n      return combinedResponses;\n    }\n  }\n\n  /**\n   * Build combined execution trace from all specialists\n   */\n  private buildCombinedTrace(\n    results: SpecialistResult[],\n    startTime: number\n  ): ExecutionTrace {\n    const allEvents: TraceEvent[] = [];\n\n    // Collect all events from specialist traces\n    results.forEach((result) => {\n      const specialistEvents = result.trace.events.map((event) => ({\n        ...event,\n        data: {\n          ...event.data,\n          specialistId: result.specialistId,\n          specialization: result.specialization,\n        },\n      }));\n      allEvents.push(...specialistEvents);\n    });\n\n    // Sort events by timestamp\n    allEvents.sort(\n      (a, b) =>\n        new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n    );\n\n    // Aggregate stats\n    const totalStats = results.reduce(\n      (acc, result) => ({\n        totalSteps: acc.totalSteps + result.trace.stats.totalSteps,\n        totalToolCalls: acc.totalToolCalls + result.trace.stats.totalToolCalls,\n        totalLLMCalls: acc.totalLLMCalls + result.trace.stats.totalLLMCalls,\n        successfulToolCalls:\n          acc.successfulToolCalls + result.trace.stats.successfulToolCalls,\n        failedToolCalls: acc.failedToolCalls + result.trace.stats.failedToolCalls,\n        totalTokensUsed:\n          (acc.totalTokensUsed ?? 0) + (result.trace.stats.totalTokensUsed ?? 0),\n      }),\n      {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n        totalTokensUsed: 0,\n      }\n    );\n\n    return {\n      executionId: this.executionId ?? generateId('swarm'),\n      agentId: this.config.id,\n      startTime: new Date(startTime).toISOString(),\n      endTime: new Date().toISOString(),\n      durationMs: Date.now() - startTime,\n      events: allEvents,\n      stats: totalStats,\n    };\n  }\n\n  /**\n   * Get supervisor trace (routing decisions)\n   */\n  private getSupervisorTrace(decisions: TaskRoutingDecision[]): ExecutionTrace {\n    const events: TraceEvent[] = decisions.map((decision) => ({\n      type: 'agent_start',\n      timestamp: new Date().toISOString(),\n      data: {\n        action: 'routing_decision',\n        specialistId: decision.specialistId,\n        reason: decision.reason,\n        confidence: decision.confidence,\n      },\n    }));\n\n    return {\n      executionId: generateId('supervisor'),\n      agentId: this.supervisor.config.id,\n      startTime: new Date().toISOString(),\n      endTime: new Date().toISOString(),\n      events,\n      stats: {\n        totalSteps: decisions.length,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n  }\n\n  /**\n   * Build an empty trace for error cases\n   */\n  private buildEmptyTrace(startTime: number): ExecutionTrace {\n    return {\n      executionId: this.executionId ?? generateId('swarm'),\n      agentId: this.config.id,\n      startTime: new Date(startTime).toISOString(),\n      endTime: new Date().toISOString(),\n      durationMs: Date.now() - startTime,\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n  }\n\n  /**\n   * Build error result for a specialist\n   */\n  private buildErrorResult(\n    specialistId: string,\n    specialization: string,\n    error: Error,\n    startTime?: number\n  ): SpecialistResult {\n    const start = startTime ?? Date.now();\n    return {\n      specialistId,\n      specialization,\n      response: '',\n      trace: this.buildEmptyTrace(start),\n      success: false,\n      error,\n      metadata: {\n        startTime: new Date(start).toISOString(),\n        endTime: new Date().toISOString(),\n        durationMs: Date.now() - start,\n      },\n    };\n  }\n\n  /**\n   * Execute with timeout\n   */\n  private async executeWithTimeout<T>(\n    promise: Promise<T>,\n    timeoutMs: number\n  ): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(`Specialist execution timeout after ${timeoutMs}ms`)),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n\n  /**\n   * Validate swarm configuration\n   */\n  private validateConfig(config: SwarmConfig): void {\n    if (!config.id || typeof config.id !== 'string') {\n      throw new AgentError(\n        'Swarm ID is required and must be a string',\n        'INVALID_SWARM_CONFIG'\n      );\n    }\n\n    if (!config.name || typeof config.name !== 'string') {\n      throw new AgentError(\n        'Swarm name is required and must be a string',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (!config.supervisor) {\n      throw new AgentError(\n        'Supervisor agent is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (!config.specialists || !Array.isArray(config.specialists)) {\n      throw new AgentError(\n        'Specialists array is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (config.specialists.length === 0) {\n      throw new AgentError(\n        'At least one specialist is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n  }\n\n  /**\n   * Get swarm metadata\n   */\n  public getMetadata(): Record<string, unknown> {\n    return {\n      id: this.config.id,\n      name: this.config.name,\n      description: this.config.description,\n      supervisorId: this.supervisor.config.id,\n      specialistsCount: this.specialists.size,\n      specialists: Array.from(this.specialists.values()).map((s) => ({\n        id: s.id,\n        specialization: s.specialization,\n        keywords: s.keywords,\n        priority: s.priority,\n      })),\n      maxConcurrent: this.config.maxConcurrent,\n      parallelExecution: this.config.parallelExecution,\n      ...this.config.metadata,\n    };\n  }\n}\n\n/**\n * Factory function to create an AgentSwarm\n */\nexport function createAgentSwarm(config: SwarmConfig): AgentSwarm {\n  return new AgentSwarm(config);\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 * 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 * 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 * 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 * 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 * Abstract base class for memory stores\n *\n * Provides a common interface for persisting user memories across different backends.\n * All memory store implementations must extend this class and implement the abstract methods.\n */\n\nimport {\n  MemoryItem,\n  MemoryType,\n  MemorySearchOptions,\n  SaveMemoryOptions,\n  UpdateMemoryOptions,\n  MemoryStoreStats,\n  BaseMemoryStoreConfig,\n} from './types'\n\nexport abstract class MemoryStore {\n  protected config: BaseMemoryStoreConfig\n\n  constructor(config: BaseMemoryStoreConfig = {}) {\n    this.config = {\n      defaultTTL: config.defaultTTL || 0, // 0 = no expiration\n      namespace: config.namespace || 'aikit',\n      memoryConfig: {\n        defaultImportance: 0.5,\n        defaultConfidence: 0.8,\n        maxMemoriesPerUser: 1000,\n        minImportanceThreshold: 0.1,\n        autoConsolidate: false,\n        ...config.memoryConfig,\n      },\n    }\n  }\n\n  /**\n   * Save a memory item\n   * @param memory - Memory item to save\n   * @param options - Optional save options\n   * @returns The saved memory item\n   */\n  abstract save(\n    memory: Omit<MemoryItem, 'id' | 'createdAt' | 'updatedAt' | 'lastAccessedAt'>,\n    options?: SaveMemoryOptions\n  ): Promise<MemoryItem>\n\n  /**\n   * Get a memory by ID\n   * @param memoryId - Unique identifier for the memory\n   * @returns The memory item if found, null otherwise\n   */\n  abstract get(memoryId: string): Promise<MemoryItem | null>\n\n  /**\n   * Update a memory item\n   * @param memoryId - Unique identifier for the memory\n   * @param updates - Updates to apply\n   * @returns The updated memory item\n   */\n  abstract update(\n    memoryId: string,\n    updates: UpdateMemoryOptions\n  ): Promise<MemoryItem | null>\n\n  /**\n   * Delete a memory by ID\n   * @param memoryId - Unique identifier for the memory\n   * @returns True if deleted, false if not found\n   */\n  abstract delete(memoryId: string): Promise<boolean>\n\n  /**\n   * Search memories for a user\n   * @param userId - User ID to search memories for\n   * @param options - Search options\n   * @returns Array of matching memory items\n   */\n  abstract search(\n    userId: string,\n    options?: MemorySearchOptions\n  ): Promise<MemoryItem[]>\n\n  /**\n   * Get all memories for a user\n   * @param userId - User ID\n   * @param includeExpired - Whether to include expired memories\n   * @returns Array of memory items\n   */\n  abstract getByUser(\n    userId: string,\n    includeExpired?: boolean\n  ): Promise<MemoryItem[]>\n\n  /**\n   * Get memories by type\n   * @param userId - User ID\n   * @param type - Memory type\n   * @param includeExpired - Whether to include expired memories\n   * @returns Array of memory items\n   */\n  abstract getByType(\n    userId: string,\n    type: MemoryType,\n    includeExpired?: boolean\n  ): Promise<MemoryItem[]>\n\n  /**\n   * Get memories by entity\n   * @param userId - User ID\n   * @param entityName - Entity name\n   * @param includeExpired - Whether to include expired memories\n   * @returns Array of memory items\n   */\n  abstract getByEntity(\n    userId: string,\n    entityName: string,\n    includeExpired?: boolean\n  ): Promise<MemoryItem[]>\n\n  /**\n   * Delete all memories for a user\n   * @param userId - User ID\n   * @returns Number of memories deleted\n   */\n  abstract deleteByUser(userId: string): Promise<number>\n\n  /**\n   * Clear all memories from the store\n   * @returns Number of memories cleared\n   */\n  abstract clear(): Promise<number>\n\n  /**\n   * Get store statistics\n   * @returns Memory store statistics\n   */\n  abstract getStats(): Promise<MemoryStoreStats>\n\n  /**\n   * Clean up expired memories\n   * @returns Number of memories removed\n   */\n  abstract cleanup(): Promise<number>\n\n  /**\n   * Close the store and cleanup resources\n   */\n  abstract close(): Promise<void>\n\n  /**\n   * Check if a memory has expired based on TTL\n   * @param memory - Memory item\n   * @returns True if expired, false otherwise\n   */\n  protected isExpired(memory: MemoryItem): boolean {\n    if (!memory.ttl || memory.ttl === 0) {\n      return false\n    }\n\n    const now = Date.now()\n    const expiresAt = memory.updatedAt + memory.ttl * 1000\n    return now > expiresAt\n  }\n\n  /**\n   * Generate a namespaced key for storage\n   * @param key - Key identifier\n   * @returns Namespaced key\n   */\n  protected getKey(key: string): string {\n    return `${this.config.namespace}:memory:${key}`\n  }\n\n  /**\n   * Generate a unique memory ID\n   * @returns Unique ID\n   */\n  protected generateId(): string {\n    return `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n  }\n\n  /**\n   * Create a complete memory item from partial data\n   * @param partial - Partial memory data\n   * @param options - Save options\n   * @returns Complete memory item\n   */\n  protected createMemoryItem(\n    partial: Omit<MemoryItem, 'id' | 'createdAt' | 'updatedAt' | 'lastAccessedAt'>,\n    options?: SaveMemoryOptions\n  ): MemoryItem {\n    const now = Date.now()\n    const ttl = options?.ttl ?? this.config.defaultTTL ?? 0\n    const importance =\n      options?.importance ??\n      partial.importance ??\n      this.config.memoryConfig?.defaultImportance ??\n      0.5\n    const confidence =\n      options?.confidence ??\n      partial.confidence ??\n      this.config.memoryConfig?.defaultConfidence ??\n      0.8\n\n    return {\n      id: this.generateId(),\n      userId: partial.userId,\n      type: partial.type,\n      content: partial.content,\n      entityName: partial.entityName,\n      entityType: partial.entityType,\n      createdAt: now,\n      updatedAt: now,\n      lastAccessedAt: now,\n      ttl: ttl > 0 ? ttl : undefined,\n      importance,\n      confidence,\n      source: options?.source ?? partial.source,\n      metadata: {\n        ...partial.metadata,\n        ...options?.metadata,\n      },\n    }\n  }\n\n  /**\n   * Filter memories based on search options\n   * @param memories - Array of memories to filter\n   * @param options - Search options\n   * @returns Filtered array of memories\n   */\n  protected filterMemories(\n    memories: MemoryItem[],\n    options?: MemorySearchOptions\n  ): MemoryItem[] {\n    let filtered = memories\n\n    // Filter by type\n    if (options?.type) {\n      filtered = filtered.filter((m) => m.type === options.type)\n    }\n\n    // Filter by entity name\n    if (options?.entityName) {\n      filtered = filtered.filter((m) => m.entityName === options.entityName)\n    }\n\n    // Filter by entity type\n    if (options?.entityType) {\n      filtered = filtered.filter((m) => m.entityType === options.entityType)\n    }\n\n    // Filter by minimum importance\n    if (options?.minImportance !== undefined) {\n      filtered = filtered.filter((m) => m.importance >= options.minImportance!)\n    }\n\n    // Filter by minimum confidence\n    if (options?.minConfidence !== undefined) {\n      filtered = filtered.filter((m) => m.confidence >= options.minConfidence!)\n    }\n\n    // Filter by age\n    if (options?.maxAge !== undefined) {\n      const maxAgeMs = options.maxAge * 1000\n      const now = Date.now()\n      filtered = filtered.filter((m) => now - m.createdAt <= maxAgeMs)\n    }\n\n    // Filter expired\n    if (!options?.includeExpired) {\n      filtered = filtered.filter((m) => !this.isExpired(m))\n    }\n\n    // Sort by importance (descending), then by recency\n    filtered.sort((a, b) => {\n      if (a.importance !== b.importance) {\n        return b.importance - a.importance\n      }\n      return b.updatedAt - a.updatedAt\n    })\n\n    // Apply limit and offset\n    const offset = options?.offset ?? 0\n    const limit = options?.limit ?? filtered.length\n\n    return filtered.slice(offset, offset + limit)\n  }\n}\n","/**\n * In-memory memory store implementation\n *\n * Stores user memories 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 { MemoryStore } from './MemoryStore'\nimport {\n  MemoryItem,\n  MemoryType,\n  MemorySearchOptions,\n  SaveMemoryOptions,\n  UpdateMemoryOptions,\n  MemoryStoreStats,\n  InMemoryMemoryStoreConfig,\n} from './types'\n\nexport class InMemoryMemoryStore extends MemoryStore {\n  private memories: Map<string, MemoryItem>\n  private userMemories: Map<string, Set<string>> // userId -> Set of memory IDs\n  private accessOrder: string[] // For LRU eviction\n  private maxMemories: number\n\n  constructor(config: Omit<InMemoryMemoryStoreConfig, 'type'> = {}) {\n    super(config)\n    this.memories = new Map()\n    this.userMemories = new Map()\n    this.accessOrder = []\n    this.maxMemories = config.maxMemories || 10000\n  }\n\n  async save(\n    memory: Omit<MemoryItem, 'id' | 'createdAt' | 'updatedAt' | 'lastAccessedAt'>,\n    options?: SaveMemoryOptions\n  ): Promise<MemoryItem> {\n    const memoryItem = this.createMemoryItem(memory, options)\n\n    this.memories.set(memoryItem.id, memoryItem)\n\n    // Track user's memories\n    if (!this.userMemories.has(memoryItem.userId)) {\n      this.userMemories.set(memoryItem.userId, new Set())\n    }\n    this.userMemories.get(memoryItem.userId)!.add(memoryItem.id)\n\n    this.updateAccessOrder(memoryItem.id)\n    this.evictIfNeeded()\n\n    return { ...memoryItem }\n  }\n\n  async get(memoryId: string): Promise<MemoryItem | null> {\n    const memory = this.memories.get(memoryId)\n\n    if (!memory) {\n      return null\n    }\n\n    // Check if expired\n    if (this.isExpired(memory)) {\n      await this.delete(memoryId)\n      return null\n    }\n\n    // Update last accessed time\n    memory.lastAccessedAt = Date.now()\n    this.updateAccessOrder(memoryId)\n\n    return { ...memory }\n  }\n\n  async update(\n    memoryId: string,\n    updates: UpdateMemoryOptions\n  ): Promise<MemoryItem | null> {\n    const memory = this.memories.get(memoryId)\n\n    if (!memory || this.isExpired(memory)) {\n      return null\n    }\n\n    const now = Date.now()\n\n    // Apply updates\n    if (updates.content !== undefined) {\n      memory.content = updates.content\n    }\n    if (updates.importance !== undefined) {\n      memory.importance = updates.importance\n    }\n    if (updates.confidence !== undefined) {\n      memory.confidence = updates.confidence\n    }\n    if (updates.ttl !== undefined) {\n      memory.ttl = updates.ttl > 0 ? updates.ttl : undefined\n    }\n    if (updates.metadata) {\n      memory.metadata = {\n        ...memory.metadata,\n        ...updates.metadata,\n      }\n    }\n\n    memory.updatedAt = now\n    memory.lastAccessedAt = now\n\n    this.updateAccessOrder(memoryId)\n\n    return { ...memory }\n  }\n\n  async delete(memoryId: string): Promise<boolean> {\n    const memory = this.memories.get(memoryId)\n\n    if (!memory) {\n      return false\n    }\n\n    // Remove from user's memories\n    const userMems = this.userMemories.get(memory.userId)\n    if (userMems) {\n      userMems.delete(memoryId)\n      if (userMems.size === 0) {\n        this.userMemories.delete(memory.userId)\n      }\n    }\n\n    this.memories.delete(memoryId)\n    this.removeFromAccessOrder(memoryId)\n\n    return true\n  }\n\n  async search(\n    userId: string,\n    options?: MemorySearchOptions\n  ): Promise<MemoryItem[]> {\n    const userMems = await this.getByUser(userId, options?.includeExpired)\n    return this.filterMemories(userMems, options)\n  }\n\n  async getByUser(\n    userId: string,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const memoryIds = this.userMemories.get(userId)\n\n    if (!memoryIds) {\n      return []\n    }\n\n    const memories: MemoryItem[] = []\n\n    for (const id of memoryIds) {\n      const memory = this.memories.get(id)\n      if (memory && (includeExpired || !this.isExpired(memory))) {\n        memories.push({ ...memory })\n      }\n    }\n\n    return memories\n  }\n\n  async getByType(\n    userId: string,\n    type: MemoryType,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const userMems = await this.getByUser(userId, includeExpired)\n    return userMems.filter((m) => m.type === type)\n  }\n\n  async getByEntity(\n    userId: string,\n    entityName: string,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const userMems = await this.getByUser(userId, includeExpired)\n    return userMems.filter((m) => m.entityName === entityName)\n  }\n\n  async deleteByUser(userId: string): Promise<number> {\n    const memoryIds = this.userMemories.get(userId)\n\n    if (!memoryIds) {\n      return 0\n    }\n\n    const count = memoryIds.size\n\n    for (const id of memoryIds) {\n      this.memories.delete(id)\n      this.removeFromAccessOrder(id)\n    }\n\n    this.userMemories.delete(userId)\n\n    return count\n  }\n\n  async clear(): Promise<number> {\n    const count = this.memories.size\n    this.memories.clear()\n    this.userMemories.clear()\n    this.accessOrder = []\n    return count\n  }\n\n  async getStats(): Promise<MemoryStoreStats> {\n    const memoriesByType: Record<MemoryType, number> = {\n      fact: 0,\n      preference: 0,\n      context: 0,\n      entity: 0,\n      goal: 0,\n    }\n\n    let expiredMemories = 0\n\n    for (const memory of this.memories.values()) {\n      memoriesByType[memory.type]++\n\n      if (this.isExpired(memory)) {\n        expiredMemories++\n      }\n    }\n\n    return {\n      totalMemories: this.memories.size,\n      memoriesByType,\n      uniqueUsers: this.userMemories.size,\n      expiredMemories,\n    }\n  }\n\n  async cleanup(): Promise<number> {\n    let removed = 0\n\n    for (const [id, memory] of this.memories.entries()) {\n      if (this.isExpired(memory)) {\n        await this.delete(id)\n        removed++\n      }\n    }\n\n    return removed\n  }\n\n  async close(): Promise<void> {\n    await this.clear()\n  }\n\n  /**\n   * Update the access order for LRU eviction\n   */\n  private updateAccessOrder(memoryId: string): void {\n    this.removeFromAccessOrder(memoryId)\n    this.accessOrder.push(memoryId)\n  }\n\n  /**\n   * Remove a memory ID from the access order\n   */\n  private removeFromAccessOrder(memoryId: string): void {\n    const index = this.accessOrder.indexOf(memoryId)\n    if (index !== -1) {\n      this.accessOrder.splice(index, 1)\n    }\n  }\n\n  /**\n   * Evict least recently used memories if over limit\n   */\n  private evictIfNeeded(): void {\n    while (this.memories.size > this.maxMemories) {\n      const lruId = this.accessOrder.shift()\n      if (lruId) {\n        const memory = this.memories.get(lruId)\n        if (memory) {\n          // Remove from user's memories\n          const userMems = this.userMemories.get(memory.userId)\n          if (userMems) {\n            userMems.delete(lruId)\n            if (userMems.size === 0) {\n              this.userMemories.delete(memory.userId)\n            }\n          }\n        }\n        this.memories.delete(lruId)\n      }\n    }\n  }\n\n  /**\n   * Get the current size of the store\n   */\n  size(): number {\n    return this.memories.size\n  }\n}\n","/**\n * ZeroDB memory store implementation\n *\n * Stores user memories in ZeroDB for cloud persistence and scalability.\n */\n\nimport { MemoryStore } from './MemoryStore'\nimport {\n  MemoryItem,\n  MemoryType,\n  MemorySearchOptions,\n  SaveMemoryOptions,\n  UpdateMemoryOptions,\n  MemoryStoreStats,\n  ZeroDBMemoryStoreConfig,\n} from './types'\n\ninterface ZeroDBTableRow {\n  id: string\n  data: string\n  userId: string\n  type: string\n  entityName?: string\n  importance: number\n  confidence: number\n  createdAt: number\n  updatedAt: number\n}\n\nexport class ZeroDBMemoryStore extends MemoryStore {\n  private projectId: string\n  private apiKey: string\n  private tableName: string\n  private baseUrl: string\n\n  constructor(config: Omit<ZeroDBMemoryStoreConfig, 'type'>) {\n    super(config)\n    this.projectId = config.projectId\n    this.apiKey = config.apiKey\n    this.tableName = config.tableName || 'user_memories'\n    this.baseUrl = 'https://api.zerodb.io/v1'\n  }\n\n  async save(\n    memory: Omit<MemoryItem, 'id' | 'createdAt' | 'updatedAt' | 'lastAccessedAt'>,\n    options?: SaveMemoryOptions\n  ): Promise<MemoryItem> {\n    const memoryItem = this.createMemoryItem(memory, options)\n\n    const row: ZeroDBTableRow = {\n      id: memoryItem.id,\n      data: JSON.stringify(memoryItem),\n      userId: memoryItem.userId,\n      type: memoryItem.type,\n      entityName: memoryItem.entityName,\n      importance: memoryItem.importance,\n      confidence: memoryItem.confidence,\n      createdAt: memoryItem.createdAt,\n      updatedAt: memoryItem.updatedAt,\n    }\n\n    await this.insertRow(row)\n\n    return { ...memoryItem }\n  }\n\n  async get(memoryId: string): Promise<MemoryItem | null> {\n    const rows = await this.queryRows({\n      filter: { id: memoryId },\n    })\n\n    if (rows.length === 0 || !rows[0]) {\n      return null\n    }\n\n    const memory: MemoryItem = JSON.parse(rows[0].data)\n\n    // Check if expired\n    if (this.isExpired(memory)) {\n      await this.delete(memoryId)\n      return null\n    }\n\n    // Update last accessed time\n    memory.lastAccessedAt = Date.now()\n    await this.updateRow(memoryId, { data: JSON.stringify(memory) })\n\n    return memory\n  }\n\n  async update(\n    memoryId: string,\n    updates: UpdateMemoryOptions\n  ): Promise<MemoryItem | null> {\n    const memory = await this.get(memoryId)\n\n    if (!memory) {\n      return null\n    }\n\n    const now = Date.now()\n\n    // Apply updates\n    if (updates.content !== undefined) {\n      memory.content = updates.content\n    }\n    if (updates.importance !== undefined) {\n      memory.importance = updates.importance\n    }\n    if (updates.confidence !== undefined) {\n      memory.confidence = updates.confidence\n    }\n    if (updates.ttl !== undefined) {\n      memory.ttl = updates.ttl > 0 ? updates.ttl : undefined\n    }\n    if (updates.metadata) {\n      memory.metadata = {\n        ...memory.metadata,\n        ...updates.metadata,\n      }\n    }\n\n    memory.updatedAt = now\n    memory.lastAccessedAt = now\n\n    // Update in ZeroDB\n    await this.updateRow(memoryId, {\n      data: JSON.stringify(memory),\n      importance: memory.importance,\n      confidence: memory.confidence,\n      updatedAt: now,\n    })\n\n    return memory\n  }\n\n  async delete(memoryId: string): Promise<boolean> {\n    try {\n      await this.deleteRow(memoryId)\n      return true\n    } catch (error) {\n      return false\n    }\n  }\n\n  async search(\n    userId: string,\n    options?: MemorySearchOptions\n  ): Promise<MemoryItem[]> {\n    const memories = await this.getByUser(userId, options?.includeExpired)\n    return this.filterMemories(memories, options)\n  }\n\n  async getByUser(\n    userId: string,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const rows = await this.queryRows({\n      filter: { userId },\n    })\n\n    return this.rowsToMemories(rows, includeExpired)\n  }\n\n  async getByType(\n    userId: string,\n    type: MemoryType,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const rows = await this.queryRows({\n      filter: { userId, type },\n    })\n\n    return this.rowsToMemories(rows, includeExpired)\n  }\n\n  async getByEntity(\n    userId: string,\n    entityName: string,\n    includeExpired: boolean = false\n  ): Promise<MemoryItem[]> {\n    const rows = await this.queryRows({\n      filter: { userId, entityName },\n    })\n\n    return this.rowsToMemories(rows, includeExpired)\n  }\n\n  async deleteByUser(userId: string): Promise<number> {\n    const rows = await this.queryRows({\n      filter: { userId },\n    })\n\n    for (const row of rows) {\n      await this.deleteRow(row.id)\n    }\n\n    return rows.length\n  }\n\n  async clear(): Promise<number> {\n    const rows = await this.queryRows({})\n\n    for (const row of rows) {\n      await this.deleteRow(row.id)\n    }\n\n    return rows.length\n  }\n\n  async getStats(): Promise<MemoryStoreStats> {\n    const rows = await this.queryRows({})\n\n    const memoriesByType: Record<MemoryType, number> = {\n      fact: 0,\n      preference: 0,\n      context: 0,\n      entity: 0,\n      goal: 0,\n    }\n\n    const userSet = new Set<string>()\n    let expiredMemories = 0\n\n    for (const row of rows) {\n      const memory: MemoryItem = JSON.parse(row.data)\n\n      if (memory.type in memoriesByType) {\n        memoriesByType[memory.type]++\n      }\n\n      userSet.add(memory.userId)\n\n      if (this.isExpired(memory)) {\n        expiredMemories++\n      }\n    }\n\n    return {\n      totalMemories: rows.length,\n      memoriesByType,\n      uniqueUsers: userSet.size,\n      expiredMemories,\n    }\n  }\n\n  async cleanup(): Promise<number> {\n    const rows = await this.queryRows({})\n    let removed = 0\n\n    for (const row of rows) {\n      const memory: MemoryItem = JSON.parse(row.data)\n      if (this.isExpired(memory)) {\n        await this.deleteRow(row.id)\n        removed++\n      }\n    }\n\n    return removed\n  }\n\n  async close(): Promise<void> {\n    // No persistent connections to close\n  }\n\n  /**\n   * Convert rows to memory items\n   */\n  private rowsToMemories(\n    rows: ZeroDBTableRow[],\n    includeExpired: boolean = false\n  ): MemoryItem[] {\n    const memories: MemoryItem[] = []\n\n    for (const row of rows) {\n      const memory: MemoryItem = JSON.parse(row.data)\n      if (includeExpired || !this.isExpired(memory)) {\n        memories.push(memory)\n      }\n    }\n\n    return memories\n  }\n\n  /**\n   * Insert a row into ZeroDB\n   */\n  private async insertRow(row: ZeroDBTableRow): Promise<void> {\n    const response = await fetch(\n      `${this.baseUrl}/projects/${this.projectId}/tables/${this.tableName}/insert`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({ rows: [row] }),\n      }\n    )\n\n    if (!response.ok) {\n      throw new Error(`ZeroDB insert failed: ${response.statusText}`)\n    }\n  }\n\n  /**\n   * Query rows from ZeroDB\n   */\n  private async queryRows(params: {\n    filter?: Record<string, any>\n    limit?: number\n    offset?: number\n  }): Promise<ZeroDBTableRow[]> {\n    const response = await fetch(\n      `${this.baseUrl}/projects/${this.projectId}/tables/${this.tableName}/query`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify(params),\n      }\n    )\n\n    if (!response.ok) {\n      throw new Error(`ZeroDB query failed: ${response.statusText}`)\n    }\n\n    const data = await response.json()\n    return data.rows || []\n  }\n\n  /**\n   * Update a row in ZeroDB\n   */\n  private async updateRow(\n    id: string,\n    updates: Partial<ZeroDBTableRow>\n  ): Promise<void> {\n    const response = await fetch(\n      `${this.baseUrl}/projects/${this.projectId}/tables/${this.tableName}/update`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({\n          filter: { id },\n          updates,\n        }),\n      }\n    )\n\n    if (!response.ok) {\n      throw new Error(`ZeroDB update failed: ${response.statusText}`)\n    }\n  }\n\n  /**\n   * Delete a row from ZeroDB\n   */\n  private async deleteRow(id: string): Promise<void> {\n    const response = await fetch(\n      `${this.baseUrl}/projects/${this.projectId}/tables/${this.tableName}/delete`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({\n          filter: { id },\n        }),\n      }\n    )\n\n    if (!response.ok) {\n      throw new Error(`ZeroDB delete failed: ${response.statusText}`)\n    }\n  }\n}\n","/**\n * Fact extractor for user memory system\n *\n * Uses LLM to extract facts, preferences, entities, and other memory items\n * from conversations.\n */\n\nimport { LLMProvider } from '../agents/llm/LLMProvider'\nimport { Message } from '../agents/types'\nimport { FactExtractionResult, MemoryType } from './types'\n\n/**\n * Configuration for fact extraction\n */\nexport interface FactExtractorConfig {\n  /** LLM provider to use for extraction */\n  llmProvider: LLMProvider\n  /** Temperature for LLM calls (0-1) */\n  temperature?: number\n  /** Maximum tokens for LLM response */\n  maxTokens?: number\n  /** Minimum confidence score to include a fact (0-1) */\n  minConfidence?: number\n  /** Whether to extract entities */\n  extractEntities?: boolean\n  /** Whether to extract preferences */\n  extractPreferences?: boolean\n  /** Whether to extract goals */\n  extractGoals?: boolean\n}\n\n/**\n * Fact extractor class\n */\nexport class FactExtractor {\n  private config: Required<FactExtractorConfig>\n\n  constructor(config: FactExtractorConfig) {\n    this.config = {\n      temperature: config.temperature ?? 0.2,\n      maxTokens: config.maxTokens ?? 1000,\n      minConfidence: config.minConfidence ?? 0.6,\n      extractEntities: config.extractEntities ?? true,\n      extractPreferences: config.extractPreferences ?? true,\n      extractGoals: config.extractGoals ?? true,\n      ...config,\n    }\n  }\n\n  /**\n   * Extract facts from messages\n   * @param messages - Array of conversation messages\n   * @returns Extraction result with facts and entities\n   */\n  async extract(messages: Message[]): Promise<FactExtractionResult> {\n    try {\n      // Build the extraction prompt\n      const prompt = this.buildExtractionPrompt(messages)\n\n      // Call LLM\n      const response = await this.config.llmProvider.chat({\n        messages: [\n          {\n            role: 'system',\n            content: this.getSystemPrompt(),\n          },\n          {\n            role: 'user',\n            content: prompt,\n          },\n        ],\n        temperature: this.config.temperature,\n        maxTokens: this.config.maxTokens,\n      })\n\n      // Parse the response\n      const result = this.parseExtractionResult(response.content)\n\n      // Filter by confidence\n      result.facts = result.facts.filter(\n        (f) => f.confidence >= this.config.minConfidence\n      )\n      result.entities = result.entities.filter(\n        (e) => e.confidence >= this.config.minConfidence\n      )\n\n      return result\n    } catch (error) {\n      return {\n        facts: [],\n        entities: [],\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      }\n    }\n  }\n\n  /**\n   * Build extraction prompt from messages\n   */\n  private buildExtractionPrompt(messages: Message[]): string {\n    const conversation = messages\n      .map((m) => `${m.role.toUpperCase()}: ${m.content}`)\n      .join('\\n')\n\n    return `Analyze the following conversation and extract relevant information:\n\n${conversation}\n\nExtract the following:\n1. Facts about the user (objective information)\n2. User preferences (likes, dislikes, opinions)\n3. Context information (background, situation)\n${this.config.extractEntities ? '4. Named entities (people, places, organizations, etc.)' : ''}\n${this.config.extractGoals ? '5. User goals and objectives' : ''}\n\nProvide your response in JSON format.`\n  }\n\n  /**\n   * Get system prompt for extraction\n   */\n  private getSystemPrompt(): string {\n    return `You are an expert at extracting structured information from conversations.\nYour task is to identify and extract facts, preferences, context, entities, and goals from user messages.\n\nFor each extracted item, provide:\n- content: The actual information\n- type: One of \"fact\", \"preference\", \"context\", \"entity\", or \"goal\"\n- confidence: A score from 0 to 1 indicating your confidence in this extraction\n- importance: A score from 0 to 1 indicating how important this information is\n\nFor entities, also include:\n- name: The entity name\n- entityType: The type of entity (person, place, organization, product, event, other)\n\nReturn your response in this exact JSON format:\n{\n  \"facts\": [\n    {\n      \"content\": \"The extracted information\",\n      \"type\": \"fact|preference|context|entity|goal\",\n      \"entityName\": \"Entity name (for entity type only)\",\n      \"entityType\": \"person|place|organization|product|event|other (for entity type only)\",\n      \"confidence\": 0.0-1.0,\n      \"importance\": 0.0-1.0\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Entity name\",\n      \"type\": \"person|place|organization|product|event|other\",\n      \"context\": \"Context where the entity was mentioned\",\n      \"confidence\": 0.0-1.0\n    }\n  ]\n}\n\nGuidelines:\n- Extract only concrete, specific information\n- Avoid extracting generic or trivial facts\n- Higher confidence for explicit statements, lower for implied information\n- Higher importance for unique, identifying information\n- Only extract information explicitly stated or strongly implied\n- For preferences, focus on expressed likes, dislikes, and opinions\n- For goals, identify stated objectives or intentions\n- For entities, identify proper nouns and specific references`\n  }\n\n  /**\n   * Parse extraction result from LLM response\n   */\n  private parseExtractionResult(content: string): FactExtractionResult {\n    try {\n      // Try to extract JSON from the response\n      const jsonMatch = content.match(/\\{[\\s\\S]*\\}/)\n      if (!jsonMatch) {\n        throw new Error('No JSON found in response')\n      }\n\n      const parsed = JSON.parse(jsonMatch[0])\n\n      return {\n        facts: Array.isArray(parsed.facts) ? parsed.facts : [],\n        entities: Array.isArray(parsed.entities) ? parsed.entities : [],\n        success: true,\n      }\n    } catch (error) {\n      return {\n        facts: [],\n        entities: [],\n        success: false,\n        error: error instanceof Error ? error.message : 'Failed to parse response',\n      }\n    }\n  }\n\n  /**\n   * Extract facts from a single message\n   * @param message - Single message to extract from\n   * @returns Extraction result\n   */\n  async extractFromMessage(message: Message): Promise<FactExtractionResult> {\n    return this.extract([message])\n  }\n\n  /**\n   * Deduplicate extracted facts\n   * @param facts - Array of facts to deduplicate\n   * @returns Deduplicated array of facts\n   */\n  deduplicateFacts(\n    facts: Array<{\n      content: string\n      type: MemoryType\n      confidence: number\n      importance: number\n    }>\n  ): Array<{\n    content: string\n    type: MemoryType\n    confidence: number\n    importance: number\n  }> {\n    const seen = new Set<string>()\n    const unique: typeof facts = []\n\n    for (const fact of facts) {\n      // Normalize content for comparison\n      const normalized = fact.content.toLowerCase().trim()\n\n      if (!seen.has(normalized)) {\n        seen.add(normalized)\n        unique.push(fact)\n      } else {\n        // If duplicate, keep the one with higher confidence\n        const existingIndex = unique.findIndex(\n          (f) => f.content.toLowerCase().trim() === normalized\n        )\n        if (\n          existingIndex !== -1 &&\n          unique[existingIndex] &&\n          fact.confidence > unique[existingIndex].confidence\n        ) {\n          unique[existingIndex] = fact\n        }\n      }\n    }\n\n    return unique\n  }\n}\n","/**\n * User memory system\n *\n * Provides high-level API for managing user memories across conversations.\n * Supports fact extraction, contradiction detection, and memory consolidation.\n */\n\nimport { Message } from '../agents/types'\nimport { LLMProvider } from '../agents/llm/LLMProvider'\nimport { MemoryStore } from './MemoryStore'\nimport { FactExtractor } from './FactExtractor'\nimport {\n  MemoryItem,\n  MemoryType,\n  MemorySearchOptions,\n  SaveMemoryOptions,\n  ContradictionResult,\n  ConsolidationResult,\n} from './types'\n\n/**\n * Configuration for UserMemory\n */\nexport interface UserMemoryConfig {\n  /** Memory store implementation */\n  store: MemoryStore\n  /** LLM provider for fact extraction and analysis */\n  llmProvider?: LLMProvider\n  /** Whether to automatically extract facts from conversations */\n  autoExtract?: boolean\n  /** Whether to automatically detect contradictions */\n  detectContradictions?: boolean\n  /** Whether to automatically consolidate similar memories */\n  autoConsolidate?: boolean\n  /** Minimum confidence for auto-extracted facts */\n  minConfidence?: number\n}\n\n/**\n * User memory system\n */\nexport class UserMemory {\n  private store: MemoryStore\n  private llmProvider?: LLMProvider\n  private factExtractor?: FactExtractor\n  private detectContradictions: boolean\n  private autoConsolidate: boolean\n\n  constructor(config: UserMemoryConfig) {\n    this.store = config.store\n    this.llmProvider = config.llmProvider\n    this.detectContradictions = config.detectContradictions ?? true\n    this.autoConsolidate = config.autoConsolidate ?? false\n\n    // Initialize fact extractor if LLM provider is available\n    if (this.llmProvider) {\n      this.factExtractor = new FactExtractor({\n        llmProvider: this.llmProvider,\n        minConfidence: config.minConfidence ?? 0.6,\n      })\n    }\n  }\n\n  /**\n   * Add a memory item\n   * @param userId - User ID\n   * @param content - Memory content\n   * @param type - Memory type\n   * @param options - Save options\n   * @returns The saved memory item\n   */\n  async addMemory(\n    userId: string,\n    content: string,\n    type: MemoryType,\n    options?: SaveMemoryOptions & {\n      entityName?: string\n      entityType?: string\n    }\n  ): Promise<MemoryItem> {\n    const memory = await this.store.save(\n      {\n        userId,\n        content,\n        type,\n        entityName: options?.entityName,\n        entityType: options?.entityType,\n        importance: options?.importance ?? 0.5,\n        confidence: options?.confidence ?? 0.8,\n        source: options?.source,\n        metadata: options?.metadata,\n      },\n      options\n    )\n\n    return memory\n  }\n\n  /**\n   * Extract and save memories from conversation messages\n   * @param userId - User ID\n   * @param messages - Conversation messages\n   * @param source - Optional source identifier\n   * @returns Array of saved memory items\n   */\n  async extractFromConversation(\n    userId: string,\n    messages: Message[],\n    source?: string\n  ): Promise<MemoryItem[]> {\n    if (!this.factExtractor) {\n      throw new Error('LLM provider required for fact extraction')\n    }\n\n    // Extract facts\n    const result = await this.factExtractor.extract(messages)\n\n    if (!result.success) {\n      throw new Error(result.error || 'Fact extraction failed')\n    }\n\n    const savedMemories: MemoryItem[] = []\n\n    // Save extracted facts\n    for (const fact of result.facts) {\n      // Check for contradictions if enabled\n      if (this.detectContradictions) {\n        const contradiction = await this.checkContradiction(userId, fact.content)\n        if (contradiction.hasContradiction) {\n          // Handle contradiction based on resolution strategy\n          if (contradiction.resolution === 'replace' && contradiction.existingMemory) {\n            await this.store.delete(contradiction.existingMemory.id)\n          } else if (contradiction.resolution === 'keep_existing') {\n            continue // Skip this fact\n          }\n        }\n      }\n\n      const memory = await this.addMemory(\n        userId,\n        fact.content,\n        fact.type,\n        {\n          importance: fact.importance,\n          confidence: fact.confidence,\n          source,\n          entityName: fact.entityName,\n          entityType: fact.entityType,\n        }\n      )\n\n      savedMemories.push(memory)\n    }\n\n    // Save entity memories\n    for (const entity of result.entities) {\n      const memory = await this.addMemory(\n        userId,\n        entity.context,\n        'entity',\n        {\n          importance: 0.7,\n          confidence: entity.confidence,\n          source,\n          entityName: entity.name,\n          entityType: entity.type,\n        }\n      )\n\n      savedMemories.push(memory)\n    }\n\n    // Auto-consolidate if enabled\n    if (this.autoConsolidate) {\n      await this.consolidateMemories(userId)\n    }\n\n    return savedMemories\n  }\n\n  /**\n   * Get memory by ID\n   * @param memoryId - Memory ID\n   * @returns Memory item or null\n   */\n  async getMemory(memoryId: string): Promise<MemoryItem | null> {\n    return this.store.get(memoryId)\n  }\n\n  /**\n   * Search memories\n   * @param userId - User ID\n   * @param options - Search options\n   * @returns Array of matching memories\n   */\n  async searchMemories(\n    userId: string,\n    options?: MemorySearchOptions\n  ): Promise<MemoryItem[]> {\n    return this.store.search(userId, options)\n  }\n\n  /**\n   * Get all memories for a user\n   * @param userId - User ID\n   * @returns Array of memory items\n   */\n  async getUserMemories(userId: string): Promise<MemoryItem[]> {\n    return this.store.getByUser(userId)\n  }\n\n  /**\n   * Get memories by type\n   * @param userId - User ID\n   * @param type - Memory type\n   * @returns Array of memory items\n   */\n  async getMemoriesByType(\n    userId: string,\n    type: MemoryType\n  ): Promise<MemoryItem[]> {\n    return this.store.getByType(userId, type)\n  }\n\n  /**\n   * Get memories by entity\n   * @param userId - User ID\n   * @param entityName - Entity name\n   * @returns Array of memory items\n   */\n  async getMemoriesByEntity(\n    userId: string,\n    entityName: string\n  ): Promise<MemoryItem[]> {\n    return this.store.getByEntity(userId, entityName)\n  }\n\n  /**\n   * Update a memory\n   * @param memoryId - Memory ID\n   * @param content - New content\n   * @param importance - New importance score\n   * @returns Updated memory or null\n   */\n  async updateMemory(\n    memoryId: string,\n    updates: {\n      content?: string\n      importance?: number\n      confidence?: number\n    }\n  ): Promise<MemoryItem | null> {\n    return this.store.update(memoryId, updates)\n  }\n\n  /**\n   * Delete a memory\n   * @param memoryId - Memory ID\n   * @returns True if deleted\n   */\n  async deleteMemory(memoryId: string): Promise<boolean> {\n    return this.store.delete(memoryId)\n  }\n\n  /**\n   * Delete all memories for a user\n   * @param userId - User ID\n   * @returns Number of memories deleted\n   */\n  async deleteUserMemories(userId: string): Promise<number> {\n    return this.store.deleteByUser(userId)\n  }\n\n  /**\n   * Check for contradictions with existing memories\n   * @param userId - User ID\n   * @param newContent - New memory content\n   * @returns Contradiction result\n   */\n  async checkContradiction(\n    userId: string,\n    newContent: string\n  ): Promise<ContradictionResult> {\n    if (!this.llmProvider) {\n      return {\n        hasContradiction: false,\n        confidence: 0,\n      }\n    }\n\n    // Get existing memories\n    const existingMemories = await this.getUserMemories(userId)\n\n    if (existingMemories.length === 0) {\n      return {\n        hasContradiction: false,\n        confidence: 1.0,\n      }\n    }\n\n    // Use LLM to detect contradictions\n    const prompt = `Analyze if the following new statement contradicts any existing memories:\n\nNEW STATEMENT: ${newContent}\n\nEXISTING MEMORIES:\n${existingMemories.map((m, i) => `${i + 1}. ${m.content}`).join('\\n')}\n\nRespond in JSON format:\n{\n  \"hasContradiction\": true/false,\n  \"contradictingMemoryIndex\": number (1-based index, or null if no contradiction),\n  \"explanation\": \"explanation of the contradiction\",\n  \"confidence\": 0.0-1.0,\n  \"resolution\": \"keep_existing|replace|merge|keep_both\"\n}`\n\n    try {\n      const response = await this.llmProvider.chat({\n        messages: [\n          {\n            role: 'system',\n            content:\n              'You are an expert at detecting contradictions in statements.',\n          },\n          {\n            role: 'user',\n            content: prompt,\n          },\n        ],\n        temperature: 0.2,\n      })\n\n      const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/)\n      if (!jsonMatch) {\n        return { hasContradiction: false, confidence: 0 }\n      }\n\n      const result = JSON.parse(jsonMatch[0])\n\n      return {\n        hasContradiction: result.hasContradiction,\n        existingMemory:\n          result.contradictingMemoryIndex !== null\n            ? existingMemories[result.contradictingMemoryIndex - 1]\n            : undefined,\n        explanation: result.explanation,\n        confidence: result.confidence,\n        resolution: result.resolution,\n      }\n    } catch (error) {\n      return {\n        hasContradiction: false,\n        confidence: 0,\n      }\n    }\n  }\n\n  /**\n   * Consolidate similar memories for a user\n   * @param userId - User ID\n   * @returns Consolidation results\n   */\n  async consolidateMemories(userId: string): Promise<ConsolidationResult[]> {\n    if (!this.llmProvider) {\n      return []\n    }\n\n    const memories = await this.getUserMemories(userId)\n    const results: ConsolidationResult[] = []\n\n    // Group memories by type\n    const memoryGroups = new Map<MemoryType, MemoryItem[]>()\n    for (const memory of memories) {\n      if (!memoryGroups.has(memory.type)) {\n        memoryGroups.set(memory.type, [])\n      }\n      memoryGroups.get(memory.type)!.push(memory)\n    }\n\n    // Consolidate each group\n    for (const [_type, groupMemories] of memoryGroups) {\n      if (groupMemories.length < 2) {\n        continue\n      }\n\n      // Find similar memories to consolidate\n      const consolidated = await this.findAndConsolidateSimilar(\n        userId,\n        groupMemories\n      )\n      results.push(...consolidated)\n    }\n\n    return results\n  }\n\n  /**\n   * Find and consolidate similar memories\n   */\n  private async findAndConsolidateSimilar(\n    userId: string,\n    memories: MemoryItem[]\n  ): Promise<ConsolidationResult[]> {\n    const results: ConsolidationResult[] = []\n\n    if (!this.llmProvider || memories.length < 2) {\n      return results\n    }\n\n    // Simple similarity check - compare each pair\n    for (let i = 0; i < memories.length - 1; i++) {\n      for (let j = i + 1; j < memories.length; j++) {\n        const mem1 = memories[i]\n        const mem2 = memories[j]\n\n        // Skip if either memory is undefined\n        if (!mem1 || !mem2) {\n          continue\n        }\n\n        // Use LLM to check if memories should be consolidated\n        const shouldConsolidate = await this.shouldConsolidateMemories(\n          mem1,\n          mem2\n        )\n\n        if (shouldConsolidate.shouldMerge) {\n          // Create consolidated memory\n          const consolidated = await this.addMemory(\n            userId,\n            shouldConsolidate.mergedContent || mem1.content,\n            mem1.type,\n            {\n              importance: Math.max(mem1.importance, mem2.importance),\n              confidence: (mem1.confidence + mem2.confidence) / 2,\n              source: `consolidated:${mem1.id}:${mem2.id}`,\n            }\n          )\n\n          // Delete original memories\n          await this.deleteMemory(mem1.id)\n          await this.deleteMemory(mem2.id)\n\n          results.push({\n            consolidated: true,\n            consolidatedMemory: consolidated,\n            originalMemories: [mem1, mem2],\n            explanation: shouldConsolidate.explanation,\n          })\n        }\n      }\n    }\n\n    return results\n  }\n\n  /**\n   * Check if two memories should be consolidated\n   */\n  private async shouldConsolidateMemories(\n    mem1: MemoryItem,\n    mem2: MemoryItem\n  ): Promise<{\n    shouldMerge: boolean\n    mergedContent?: string\n    explanation?: string\n  }> {\n    if (!this.llmProvider) {\n      return { shouldMerge: false }\n    }\n\n    const prompt = `Should these two memories be consolidated into one?\n\nMEMORY 1: ${mem1.content}\nMEMORY 2: ${mem2.content}\n\nRespond in JSON format:\n{\n  \"shouldMerge\": true/false,\n  \"mergedContent\": \"consolidated content (if shouldMerge is true)\",\n  \"explanation\": \"reason for the decision\"\n}`\n\n    try {\n      const response = await this.llmProvider.chat({\n        messages: [\n          {\n            role: 'system',\n            content:\n              'You are an expert at identifying and merging similar information.',\n          },\n          {\n            role: 'user',\n            content: prompt,\n          },\n        ],\n        temperature: 0.2,\n      })\n\n      const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/)\n      if (!jsonMatch) {\n        return { shouldMerge: false }\n      }\n\n      return JSON.parse(jsonMatch[0])\n    } catch (error) {\n      return { shouldMerge: false }\n    }\n  }\n\n  /**\n   * Clean up expired memories\n   * @returns Number of memories removed\n   */\n  async cleanup(): Promise<number> {\n    return this.store.cleanup()\n  }\n\n  /**\n   * Get memory statistics\n   */\n  async getStats() {\n    return this.store.getStats()\n  }\n\n  /**\n   * Close the memory system\n   */\n  async close(): Promise<void> {\n    await this.store.close()\n  }\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 * Fluent Query Builder for ZeroDB\n *\n * Provides a fluent API for building complex database queries with\n * type safety and method chaining.\n */\n\nimport {\n  IQueryBuilder,\n  QueryOptions,\n  Filter,\n  FilterCondition,\n  FilterOperator,\n  SortDirection,\n  SortSpec,\n  QueryResult,\n} from './types'\n\nexport class QueryBuilder<T = any> implements IQueryBuilder<T> {\n  private tableName: string\n  private options: QueryOptions = {}\n  private filters: Filter[] = []\n  private orFilters: Filter[] = []\n  private notFilters: Filter[] = []\n  private executor: (table: string, options: QueryOptions) => Promise<QueryResult<T>>\n\n  constructor(\n    table: string,\n    executor: (table: string, options: QueryOptions) => Promise<QueryResult<T>>\n  ) {\n    this.tableName = table\n    this.executor = executor\n  }\n\n  /**\n   * Select specific fields\n   */\n  select(...fields: string[]): IQueryBuilder<T> {\n    this.options.select = [...(this.options.select || []), ...fields]\n    return this\n  }\n\n  /**\n   * Add WHERE condition\n   */\n  where(field: string, operator: FilterOperator, value: any): IQueryBuilder<T> {\n    const condition: FilterCondition = { field, operator, value }\n    this.filters.push({ condition })\n    return this\n  }\n\n  /**\n   * Add AND condition\n   */\n  and(field: string, operator: FilterOperator, value: any): IQueryBuilder<T> {\n    return this.where(field, operator, value)\n  }\n\n  /**\n   * Add OR condition\n   */\n  or(field: string, operator: FilterOperator, value: any): IQueryBuilder<T> {\n    const condition: FilterCondition = { field, operator, value }\n    this.orFilters.push({ condition })\n    return this\n  }\n\n  /**\n   * Add NOT condition\n   */\n  not(field: string, operator: FilterOperator, value: any): IQueryBuilder<T> {\n    const condition: FilterCondition = { field, operator, value }\n    this.notFilters.push({ condition })\n    return this\n  }\n\n  /**\n   * Add ORDER BY\n   */\n  orderBy(field: string, direction: SortDirection = 'asc'): IQueryBuilder<T> {\n    const sort: SortSpec = { field, direction }\n    this.options.sort = [...(this.options.sort || []), sort]\n    return this\n  }\n\n  /**\n   * Add LIMIT\n   */\n  limit(limit: number): IQueryBuilder<T> {\n    this.options.limit = limit\n    return this\n  }\n\n  /**\n   * Add OFFSET\n   */\n  offset(offset: number): IQueryBuilder<T> {\n    this.options.offset = offset\n    return this\n  }\n\n  /**\n   * Add JOIN\n   */\n  join(\n    table: string,\n    on: { left: string; right: string },\n    type: 'inner' | 'left' | 'right' | 'full' = 'inner'\n  ): IQueryBuilder<T> {\n    this.options.joins = [\n      ...(this.options.joins || []),\n      { table, type, on },\n    ]\n    return this\n  }\n\n  /**\n   * Add GROUP BY\n   */\n  groupBy(..._fields: string[]): IQueryBuilder<T> {\n    // Store group by fields in metadata for later processing\n    if (!this.options.select) {\n      this.options.select = []\n    }\n    // Note: Actual GROUP BY implementation would require additional options\n    return this\n  }\n\n  /**\n   * Add HAVING\n   */\n  having(_field: string, _operator: FilterOperator, _value: any): IQueryBuilder<T> {\n    // Note: HAVING implementation would require GROUP BY support\n    return this\n  }\n\n  /**\n   * Build the final filter\n   */\n  private buildFilter(): Filter | undefined {\n    if (this.filters.length === 0 && this.orFilters.length === 0 && this.notFilters.length === 0) {\n      return undefined\n    }\n\n    const filter: Filter = {}\n\n    if (this.filters.length > 0) {\n      filter.and = this.filters\n    }\n\n    if (this.orFilters.length > 0) {\n      if (filter.and) {\n        filter.and.push({ or: this.orFilters })\n      } else {\n        filter.or = this.orFilters\n      }\n    }\n\n    if (this.notFilters.length > 0) {\n      const notFilter: Filter = { or: this.notFilters }\n      if (filter.and) {\n        filter.and.push({ not: notFilter })\n      } else {\n        filter.not = notFilter\n      }\n    }\n\n    return filter\n  }\n\n  /**\n   * Execute query\n   */\n  async execute(): Promise<QueryResult<T>> {\n    const filter = this.buildFilter()\n    if (filter) {\n      this.options.filter = filter\n    }\n\n    return this.executor(this.tableName, this.options)\n  }\n\n  /**\n   * Get first result\n   */\n  async first(): Promise<T | null> {\n    this.limit(1)\n    const result = await this.execute()\n    return result.rows[0] || null\n  }\n\n  /**\n   * Get all results\n   */\n  async all(): Promise<T[]> {\n    const result = await this.execute()\n    return result.rows\n  }\n\n  /**\n   * Count results\n   */\n  async count(): Promise<number> {\n    this.options.count = true\n    const result = await this.execute()\n    return result.count || 0\n  }\n\n  /**\n   * Clone the query builder\n   */\n  clone(): QueryBuilder<T> {\n    const cloned = new QueryBuilder<T>(this.tableName, this.executor)\n    cloned.options = { ...this.options }\n    cloned.filters = [...this.filters]\n    cloned.orFilters = [...this.orFilters]\n    cloned.notFilters = [...this.notFilters]\n    return cloned\n  }\n\n  /**\n   * Reset the query builder\n   */\n  reset(): IQueryBuilder<T> {\n    this.options = {}\n    this.filters = []\n    this.orFilters = []\n    this.notFilters = []\n    return this\n  }\n\n  /**\n   * Paginate results\n   */\n  paginate(page: number, pageSize: number): IQueryBuilder<T> {\n    const offset = (page - 1) * pageSize\n    return this.limit(pageSize).offset(offset)\n  }\n\n  /**\n   * Get query options (for debugging)\n   */\n  getOptions(): QueryOptions {\n    const filter = this.buildFilter()\n    return {\n      ...this.options,\n      filter,\n    }\n  }\n}\n","/**\n * ZeroDB CRUD Client\n *\n * Comprehensive client for performing CRUD operations on ZeroDB with support for:\n * - Full CRUD operations (Create, Read, Update, Delete)\n * - Query builder with fluent API\n * - Transaction support\n * - Connection pooling\n * - Automatic retries\n * - Health checks\n */\n\nimport { EventEmitter } from 'events'\nimport { QueryBuilder } from './QueryBuilder'\nimport {\n  ZeroDBConfig,\n  IZeroDBClient,\n  IQueryBuilder,\n  InsertOptions,\n  QueryOptions,\n  UpdateOptions,\n  DeleteOptions,\n  TransactionOptions,\n  BatchOperation,\n  CRUDResult,\n  QueryResult,\n  TransactionResult,\n  HealthStatus,\n  PoolStats,\n} from './types'\n\n/**\n * Connection pool for managing database connections\n */\nclass ConnectionPool {\n  private config: Required<ZeroDBConfig>\n  private activeConnections: number = 0\n  private idleConnections: number = 0\n  private waitingRequests: number = 0\n\n  constructor(config: Required<ZeroDBConfig>) {\n    this.config = config\n    this.idleConnections = config.pool.min || 0\n  }\n\n  async acquire(): Promise<void> {\n    if (this.activeConnections >= (this.config.pool.max || 10)) {\n      this.waitingRequests++\n      await this.waitForConnection()\n      this.waitingRequests--\n    }\n\n    if (this.idleConnections > 0) {\n      this.idleConnections--\n    }\n    this.activeConnections++\n  }\n\n  release(): void {\n    if (this.activeConnections > 0) {\n      this.activeConnections--\n      this.idleConnections++\n    }\n  }\n\n  private async waitForConnection(): Promise<void> {\n    const timeout = this.config.pool.acquireTimeout || 5000\n    return new Promise((resolve, reject) => {\n      const startTime = Date.now()\n      const interval = setInterval(() => {\n        if (this.activeConnections < (this.config.pool.max || 10)) {\n          clearInterval(interval)\n          resolve()\n        } else if (Date.now() - startTime > timeout) {\n          clearInterval(interval)\n          reject(new Error('Connection acquisition timeout'))\n        }\n      }, 100)\n    })\n  }\n\n  getStats(): PoolStats {\n    return {\n      total: this.activeConnections + this.idleConnections,\n      active: this.activeConnections,\n      idle: this.idleConnections,\n      waiting: this.waitingRequests,\n    }\n  }\n\n  async close(): Promise<void> {\n    // Wait for active connections to finish\n    while (this.activeConnections > 0) {\n      await new Promise(resolve => setTimeout(resolve, 100))\n    }\n    this.idleConnections = 0\n  }\n}\n\n/**\n * ZeroDB Client implementation\n */\nexport class ZeroDBClient extends EventEmitter implements IZeroDBClient {\n  private config: Required<ZeroDBConfig>\n  private pool: ConnectionPool\n  private closed: boolean = false\n  private transactionId: string | null = null\n\n  constructor(config: ZeroDBConfig) {\n    super()\n\n    // Set defaults\n    this.config = {\n      projectId: config.projectId,\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl || 'https://api.zerodb.io',\n      pool: {\n        min: config.pool?.min || 2,\n        max: config.pool?.max || 10,\n        idleTimeout: config.pool?.idleTimeout || 30000,\n        acquireTimeout: config.pool?.acquireTimeout || 5000,\n        validate: config.pool?.validate ?? true,\n      },\n      retry: {\n        maxRetries: config.retry?.maxRetries || 3,\n        initialDelay: config.retry?.initialDelay || 1000,\n        maxDelay: config.retry?.maxDelay || 10000,\n        backoffMultiplier: config.retry?.backoffMultiplier || 2,\n        retryableErrors: config.retry?.retryableErrors || ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND'],\n      },\n      timeout: config.timeout || 30000,\n      debug: config.debug || false,\n    }\n\n    this.pool = new ConnectionPool(this.config)\n    this.emit('connect')\n  }\n\n  /**\n   * Execute API request with retry logic\n   */\n  private async executeRequest<T>(\n    operation: string,\n    params: any\n  ): Promise<T> {\n    if (this.closed) {\n      throw new Error('Client is closed')\n    }\n\n    await this.pool.acquire()\n\n    try {\n      const result = await this.retryWithBackoff(async () => {\n        const startTime = Date.now()\n\n        // In a real implementation, this would make an HTTP request to ZeroDB API\n        // For now, we'll simulate the response\n        const response = await this.mockApiCall(operation, params)\n\n        const duration = Date.now() - startTime\n        this.emit('query', operation, duration)\n\n        if (this.config.debug) {\n          console.log(`[ZeroDB] ${operation} completed in ${duration}ms`)\n        }\n\n        return response as T\n      })\n\n      return result\n    } finally {\n      this.pool.release()\n    }\n  }\n\n  /**\n   * Mock API call (to be replaced with actual HTTP requests)\n   */\n  private async mockApiCall(operation: string, params: any): Promise<any> {\n    // Simulate network delay\n    await new Promise(resolve => setTimeout(resolve, Math.random() * 100))\n\n    // Mock responses based on operation\n    switch (operation) {\n      case 'insert':\n        return {\n          success: true,\n          rowsAffected: Array.isArray(params.data) ? params.data.length : 1,\n          rows: params.options?.returning ? params.data : undefined,\n        }\n\n      case 'select':\n        return {\n          rows: [],\n          count: 0,\n        }\n\n      case 'update':\n        return {\n          success: true,\n          rowsAffected: 0,\n          rows: params.options?.returning ? [] : undefined,\n        }\n\n      case 'delete':\n        return {\n          success: true,\n          rowsAffected: 0,\n          rows: params.options?.returning ? [] : undefined,\n        }\n\n      case 'healthCheck':\n        return {\n          connected: true,\n          responseTime: 10,\n          pool: this.pool.getStats(),\n        }\n\n      default:\n        throw new Error(`Unknown operation: ${operation}`)\n    }\n  }\n\n  /**\n   * Retry with exponential backoff\n   */\n  private async retryWithBackoff<T>(\n    fn: () => Promise<T>,\n    attempt: number = 0\n  ): Promise<T> {\n    try {\n      return await fn()\n    } catch (error) {\n      const isRetryable = this.isRetryableError(error)\n      const maxRetries = this.config.retry.maxRetries ?? 3\n      const shouldRetry = attempt < maxRetries && isRetryable\n\n      if (!shouldRetry) {\n        throw error\n      }\n\n      const initialDelay = this.config.retry.initialDelay ?? 1000\n      const backoffMultiplier = this.config.retry.backoffMultiplier ?? 2\n      const maxDelay = this.config.retry.maxDelay ?? 10000\n\n      const delay = Math.min(\n        initialDelay * Math.pow(backoffMultiplier, attempt),\n        maxDelay\n      )\n\n      if (this.config.debug) {\n        console.log(`[ZeroDB] Retrying after ${delay}ms (attempt ${attempt + 1}/${maxRetries})`)\n      }\n\n      await new Promise(resolve => setTimeout(resolve, delay))\n      return this.retryWithBackoff(fn, attempt + 1)\n    }\n  }\n\n  /**\n   * Check if error is retryable\n   */\n  private isRetryableError(error: unknown): boolean {\n    if (!error) return false\n\n    const errorCode = (error as any)?.code || (error as any)?.errno\n    if (!errorCode) return false\n\n    const retryableErrors = this.config.retry.retryableErrors ?? ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND']\n    return retryableErrors.includes(errorCode)\n  }\n\n  /**\n   * Insert records\n   */\n  async insert<T = any>(\n    table: string,\n    data: Record<string, any> | Record<string, any>[],\n    options?: InsertOptions\n  ): Promise<CRUDResult<T>> {\n    const result = await this.executeRequest<CRUDResult<T>>('insert', {\n      table,\n      data,\n      options,\n      transactionId: this.transactionId,\n    })\n\n    return result\n  }\n\n  /**\n   * Select records\n   */\n  async select<T = any>(\n    table: string,\n    options?: QueryOptions\n  ): Promise<QueryResult<T>> {\n    const result = await this.executeRequest<QueryResult<T>>('select', {\n      table,\n      options,\n      transactionId: this.transactionId,\n    })\n\n    return result\n  }\n\n  /**\n   * Update records\n   */\n  async update<T = any>(\n    table: string,\n    data: Record<string, any>,\n    options?: UpdateOptions\n  ): Promise<CRUDResult<T>> {\n    if (!options?.filter) {\n      throw new Error('Update requires a filter to prevent accidental full table updates')\n    }\n\n    const result = await this.executeRequest<CRUDResult<T>>('update', {\n      table,\n      data,\n      options,\n      transactionId: this.transactionId,\n    })\n\n    return result\n  }\n\n  /**\n   * Delete records\n   */\n  async delete<T = any>(\n    table: string,\n    options?: DeleteOptions\n  ): Promise<CRUDResult<T>> {\n    if (!options?.filter) {\n      throw new Error('Delete requires a filter to prevent accidental full table deletion')\n    }\n\n    const result = await this.executeRequest<CRUDResult<T>>('delete', {\n      table,\n      options,\n      transactionId: this.transactionId,\n    })\n\n    return result\n  }\n\n  /**\n   * Upsert records (insert or update on conflict)\n   */\n  async upsert<T = any>(\n    table: string,\n    data: Record<string, any> | Record<string, any>[],\n    options?: InsertOptions\n  ): Promise<CRUDResult<T>> {\n    // Upsert is implemented as insert with onConflict option\n    const upsertOptions: InsertOptions = {\n      ...options,\n      onConflict: options?.onConflict || {\n        target: ['id'],\n        action: 'update',\n      },\n    }\n\n    return this.insert<T>(table, data, upsertOptions)\n  }\n\n  /**\n   * Execute batch operations\n   */\n  async batch(operations: BatchOperation[]): Promise<TransactionResult> {\n    return this.transaction(async (client) => {\n      let totalRowsAffected = 0\n      let operationsExecuted = 0\n\n      for (const op of operations) {\n        try {\n          switch (op.type) {\n            case 'insert':\n              const insertResult = await client.insert(op.table, op.data!, op.options as InsertOptions)\n              totalRowsAffected += insertResult.rowsAffected\n              break\n\n            case 'update':\n              const updateResult = await client.update(op.table, op.data!, op.options as UpdateOptions)\n              totalRowsAffected += updateResult.rowsAffected\n              break\n\n            case 'delete':\n              const deleteResult = await client.delete(op.table, op.options as DeleteOptions)\n              totalRowsAffected += deleteResult.rowsAffected\n              break\n          }\n          operationsExecuted++\n        } catch (error) {\n          throw new Error(`Batch operation failed at index ${operationsExecuted}: ${error}`)\n        }\n      }\n\n      return {\n        success: true,\n        operationsExecuted,\n        totalRowsAffected,\n      }\n    })\n  }\n\n  /**\n   * Create query builder\n   */\n  query<T = any>(table: string): IQueryBuilder<T> {\n    return new QueryBuilder<T>(table, (tbl, opts) => this.select<T>(tbl, opts))\n  }\n\n  /**\n   * Execute transaction\n   */\n  async transaction<T>(\n    callback: (client: IZeroDBClient) => Promise<T>,\n    _options?: TransactionOptions\n  ): Promise<T> {\n    const txId = this.generateTransactionId()\n    const previousTxId = this.transactionId\n\n    try {\n      this.transactionId = txId\n      this.emit('transactionStart', txId)\n\n      if (this.config.debug) {\n        console.log(`[ZeroDB] Transaction started: ${txId}`)\n      }\n\n      const result = await callback(this)\n\n      this.emit('transactionCommit', txId)\n\n      if (this.config.debug) {\n        console.log(`[ZeroDB] Transaction committed: ${txId}`)\n      }\n\n      return result\n    } catch (error) {\n      this.emit('transactionRollback', txId)\n\n      if (this.config.debug) {\n        console.log(`[ZeroDB] Transaction rolled back: ${txId}`)\n      }\n\n      throw error\n    } finally {\n      this.transactionId = previousTxId\n    }\n  }\n\n  /**\n   * Generate unique transaction ID\n   */\n  private generateTransactionId(): string {\n    return `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n  }\n\n  /**\n   * Check connection health\n   */\n  async healthCheck(): Promise<HealthStatus> {\n    try {\n      const startTime = Date.now()\n      await this.executeRequest<HealthStatus>('healthCheck', {})\n      const responseTime = Date.now() - startTime\n\n      return {\n        connected: true,\n        responseTime,\n        pool: this.pool.getStats(),\n      }\n    } catch (error) {\n      return {\n        connected: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n        pool: this.pool.getStats(),\n      }\n    }\n  }\n\n  /**\n   * Close connection\n   */\n  async close(): Promise<void> {\n    if (this.closed) {\n      return\n    }\n\n    this.closed = true\n    await this.pool.close()\n    this.emit('disconnect')\n\n    if (this.config.debug) {\n      console.log('[ZeroDB] Connection closed')\n    }\n  }\n\n  /**\n   * Get pool statistics\n   */\n  getPoolStats(): PoolStats {\n    return this.pool.getStats()\n  }\n\n  /**\n   * Check if client is closed\n   */\n  isClosed(): boolean {\n    return this.closed\n  }\n\n  /**\n   * Get configuration (excluding sensitive data)\n   */\n  getConfig(): Partial<ZeroDBConfig> {\n    return {\n      projectId: this.config.projectId,\n      baseUrl: this.config.baseUrl,\n      pool: this.config.pool,\n      retry: this.config.retry,\n      timeout: this.config.timeout,\n      debug: this.config.debug,\n    }\n  }\n}\n\n/**\n * Create a new ZeroDB client\n */\nexport function createZeroDBClient(config: ZeroDBConfig): ZeroDBClient {\n  return new ZeroDBClient(config)\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 * Semantic search implementation for conversation history\n *\n * Provides vector-based semantic search using OpenAI embeddings API.\n * Supports similarity search, ranking, and filtering across conversations.\n */\n\nimport OpenAI from 'openai'\nimport { Message } from '../types'\nimport { ConversationStore } from '../store/ConversationStore'\nimport {\n  EmbeddingConfig,\n  SearchOptions,\n  SearchResult,\n  SimilarMessageOptions,\n  ConversationSearchOptions,\n  BatchEmbeddingRequest,\n  BatchEmbeddingResponse,\n  EmbeddingCacheEntry,\n  SearchStats,\n  SearchFilter,\n  EmbeddingModel,\n} from './types'\n\n/**\n * Semantic search engine for conversation messages\n */\nexport class SemanticSearch {\n  private openai: OpenAI\n  private config: Required<Omit<EmbeddingConfig, 'apiKey'>>\n  private store: ConversationStore\n  private embeddingCache: Map<string, EmbeddingCacheEntry>\n  private stats: SearchStats\n\n  constructor(store: ConversationStore, config: EmbeddingConfig) {\n    if (!config.apiKey) {\n      throw new Error('OpenAI API key is required')\n    }\n\n    this.store = store\n    this.openai = new OpenAI({\n      apiKey: config.apiKey,\n      maxRetries: config.maxRetries ?? 3,\n      timeout: config.timeout ?? 30000,\n    })\n\n    this.config = {\n      model: config.model ?? 'text-embedding-3-small',\n      batchSize: config.batchSize ?? 100,\n      dimensions: config.dimensions ?? 1536,\n      maxRetries: config.maxRetries ?? 3,\n      timeout: config.timeout ?? 30000,\n    }\n\n    this.embeddingCache = new Map()\n    this.stats = {\n      totalMessages: 0,\n      totalConversations: 0,\n      totalEmbeddings: 0,\n      cacheHitRate: 0,\n      avgEmbeddingTime: 0,\n    }\n  }\n\n  /**\n   * Generate embedding for a single text\n   */\n  private async generateEmbedding(text: string): Promise<number[]> {\n    const cacheKey = this.getCacheKey(text, this.config.model)\n    const cached = this.embeddingCache.get(cacheKey)\n\n    if (cached && !this.isCacheExpired(cached)) {\n      return cached.embedding\n    }\n\n    const startTime = Date.now()\n\n    try {\n      const response = await this.openai.embeddings.create({\n        model: this.config.model,\n        input: text,\n        dimensions: this.config.dimensions,\n      })\n\n      const embedding = response.data[0]?.embedding\n      if (!embedding) {\n        throw new Error('Failed to generate embedding')\n      }\n      const duration = Date.now() - startTime\n\n      // Update cache\n      this.embeddingCache.set(cacheKey, {\n        text,\n        embedding,\n        model: this.config.model,\n        cachedAt: Date.now(),\n        ttl: 3600000, // 1 hour\n      })\n\n      // Update stats\n      this.stats.totalEmbeddings++\n      this.updateAvgEmbeddingTime(duration)\n\n      return embedding\n    } catch (error) {\n      throw new Error(\n        `Failed to generate embedding: ${error instanceof Error ? error.message : String(error)}`\n      )\n    }\n  }\n\n  /**\n   * Generate embeddings for multiple texts in batches\n   */\n  async generateBatchEmbeddings(\n    request: BatchEmbeddingRequest\n  ): Promise<BatchEmbeddingResponse> {\n    const { texts, model, dimensions } = request\n    const embedModel = model ?? this.config.model\n    const embedDimensions = dimensions ?? this.config.dimensions\n\n    if (texts.length === 0) {\n      return {\n        embeddings: [],\n        model: embedModel,\n        usage: { promptTokens: 0, totalTokens: 0 },\n      }\n    }\n\n    const embeddings: number[][] = []\n    let totalPromptTokens = 0\n    let totalTokens = 0\n\n    // Process in batches\n    for (let i = 0; i < texts.length; i += this.config.batchSize) {\n      const batch = texts.slice(i, i + this.config.batchSize)\n      const batchEmbeddings: number[][] = []\n\n      // Check cache first\n      const uncachedTexts: string[] = []\n      const uncachedIndices: number[] = []\n\n      batch.forEach((text, index) => {\n        const cacheKey = this.getCacheKey(text, embedModel)\n        const cached = this.embeddingCache.get(cacheKey)\n\n        if (cached && !this.isCacheExpired(cached)) {\n          batchEmbeddings[index] = cached.embedding\n        } else {\n          uncachedTexts.push(text)\n          uncachedIndices.push(index)\n        }\n      })\n\n      // Generate embeddings for uncached texts\n      if (uncachedTexts.length > 0) {\n        const response = await this.openai.embeddings.create({\n          model: embedModel,\n          input: uncachedTexts,\n          dimensions: embedDimensions,\n        })\n\n        uncachedIndices.forEach((index, i) => {\n          const embedding = response.data[i]?.embedding\n          if (embedding) {\n            batchEmbeddings[index] = embedding\n\n            // Cache the result\n            const text = uncachedTexts[i]\n            if (text) {\n              this.embeddingCache.set(this.getCacheKey(text, embedModel), {\n                text,\n                embedding,\n                model: embedModel,\n                cachedAt: Date.now(),\n                ttl: 3600000,\n              })\n            }\n          }\n        })\n\n        totalPromptTokens += response.usage.prompt_tokens\n        totalTokens += response.usage.total_tokens\n        this.stats.totalEmbeddings += uncachedTexts.length\n      }\n\n      embeddings.push(...batchEmbeddings)\n    }\n\n    this.updateCacheHitRate()\n\n    return {\n      embeddings,\n      model: embedModel,\n      usage: {\n        promptTokens: totalPromptTokens,\n        totalTokens,\n      },\n    }\n  }\n\n  /**\n   * Search messages by semantic similarity\n   */\n  async searchMessages(\n    query: string,\n    options: SearchOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 10,\n      threshold = 0.0,\n      filter,\n    } = options\n\n    // Generate query embedding\n    const queryEmbedding = await this.generateEmbedding(query)\n\n    // Get messages from store based on filter\n    const messages = await this.getFilteredMessages(filter)\n\n    if (messages.length === 0) {\n      return []\n    }\n\n    // Generate embeddings for all messages\n    const messageEmbeddings = await this.generateBatchEmbeddings({\n      texts: messages.map((m) => this.getMessageContentAsString(m.content)),\n      model: this.config.model,\n      dimensions: this.config.dimensions,\n    })\n\n    // Calculate similarities and create results\n    const results: SearchResult[] = []\n\n    messages.forEach((message, index) => {\n      const embedding = messageEmbeddings.embeddings[index]\n      if (!embedding) return\n      const similarity = this.cosineSimilarity(queryEmbedding, embedding)\n\n      if (similarity >= threshold) {\n        results.push({\n          message,\n          similarity: {\n            score: similarity,\n            distance: 1 - similarity,\n            rank: 0, // Will be set after sorting\n          },\n          conversationId: (message as any).conversationId,\n        })\n      }\n    })\n\n    // Sort by similarity (descending)\n    results.sort((a, b) => b.similarity.score - a.similarity.score)\n\n    // Set ranks and limit results\n    const topResults = results.slice(0, topK)\n    topResults.forEach((result, index) => {\n      result.similarity.rank = index + 1\n    })\n\n    return topResults\n  }\n\n  /**\n   * Find similar messages to a given message\n   */\n  async findSimilarMessages(\n    messageId: string,\n    options: SimilarMessageOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 5,\n      threshold = 0.5,\n      includeSelf = false,\n      filter,\n    } = options\n\n    // Find the source message\n    const sourceMessage = await this.findMessageById(messageId)\n    if (!sourceMessage) {\n      throw new Error(`Message with id ${messageId} not found`)\n    }\n\n    // Search using the source message content\n    const results = await this.searchMessages(\n      this.getMessageContentAsString(sourceMessage.content),\n      {\n        topK: includeSelf ? topK : topK + 1,\n        threshold,\n        filter,\n      }\n    )\n\n    // Filter out the source message if not included\n    const filteredResults = includeSelf\n      ? results\n      : results.filter((r) => r.message.id !== messageId)\n\n    return filteredResults.slice(0, topK)\n  }\n\n  /**\n   * Search across multiple conversations\n   */\n  async searchConversations(\n    query: string,\n    options: ConversationSearchOptions = {}\n  ): Promise<SearchResult[]> {\n    const {\n      topK = 10,\n      threshold = 0.0,\n      filter,\n      conversationIds,\n      maxConversations,\n    } = options\n\n    // Get list of conversations to search\n    let targetConversationIds: string[]\n\n    if (conversationIds && conversationIds.length > 0) {\n      targetConversationIds = conversationIds\n    } else {\n      const allConversationIds = await this.store.list()\n      targetConversationIds = maxConversations\n        ? allConversationIds.slice(0, maxConversations)\n        : allConversationIds\n    }\n\n    // Update filter to include conversation IDs\n    const updatedFilter: SearchFilter = {\n      ...filter,\n    }\n\n    // Search messages\n    const results = await this.searchMessages(query, {\n      topK,\n      threshold,\n      filter: updatedFilter,\n    })\n\n    // Filter results by conversation IDs\n    const filteredResults = conversationIds\n      ? results.filter((r) =>\n          conversationIds.includes(r.conversationId || '')\n        )\n      : results\n\n    // Update stats\n    this.stats.totalConversations = targetConversationIds.length\n\n    return filteredResults\n  }\n\n  /**\n   * Convert message content to a string for embedding\n   */\n  private getMessageContentAsString(\n    content: Message['content']\n  ): string {\n    if (typeof content === 'string') {\n      return content\n    }\n    if (Array.isArray(content)) {\n      return content\n        .map((part) => {\n          if (typeof part === 'string') return part\n          if (part && typeof part === 'object' && 'text' in part) {\n            return (part as { text: string }).text\n          }\n          return ''\n        })\n        .join(' ')\n    }\n    if (content && typeof content === 'object' && 'text' in content) {\n      return (content as { text: string }).text\n    }\n    return String(content)\n  }\n\n  /**\n   * Calculate cosine similarity between two vectors\n   */\n  private cosineSimilarity(a: number[], b: number[]): number {\n    if (a.length !== b.length) {\n      throw new Error('Vectors must have the same length')\n    }\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] ?? 0\n      const bVal = b[i] ?? 0\n      dotProduct += aVal * bVal\n      normA += aVal * aVal\n      normB += bVal * bVal\n    }\n\n    const denominator = Math.sqrt(normA) * Math.sqrt(normB)\n\n    if (denominator === 0) {\n      return 0\n    }\n\n    return dotProduct / denominator\n  }\n\n  /**\n   * Get filtered messages from the store\n   */\n  private async getFilteredMessages(\n    filter?: SearchFilter\n  ): Promise<(Message & { conversationId?: string })[]> {\n    const conversationIds = await this.store.list()\n    const allMessages: (Message & { conversationId?: string })[] = []\n\n    for (const conversationId of conversationIds) {\n      const conversation = await this.store.load(conversationId)\n\n      if (!conversation) {\n        continue\n      }\n\n      let messages = conversation.messages\n\n      // Apply filters\n      if (filter) {\n        messages = messages.filter((message) => {\n          // Filter by conversation ID\n          if (\n            filter.conversationId &&\n            conversationId !== filter.conversationId\n          ) {\n            return false\n          }\n\n          // Filter by role\n          if (filter.role && message.role !== filter.role) {\n            return false\n          }\n\n          // Filter by date range\n          if (filter.startDate && message.timestamp < filter.startDate) {\n            return false\n          }\n\n          if (filter.endDate && message.timestamp > filter.endDate) {\n            return false\n          }\n\n          return true\n        })\n      }\n\n      // Add conversation ID to messages\n      const messagesWithConvId = messages.map((m) => ({\n        ...m,\n        conversationId,\n      }))\n\n      allMessages.push(...messagesWithConvId)\n    }\n\n    this.stats.totalMessages = allMessages.length\n\n    return allMessages\n  }\n\n  /**\n   * Find a message by ID across all conversations\n   */\n  private async findMessageById(\n    messageId: string\n  ): Promise<Message | null> {\n    const conversationIds = await this.store.list()\n\n    for (const conversationId of conversationIds) {\n      const conversation = await this.store.load(conversationId)\n\n      if (!conversation) {\n        continue\n      }\n\n      const message = conversation.messages.find((m) => m.id === messageId)\n\n      if (message) {\n        return message\n      }\n    }\n\n    return null\n  }\n\n  /**\n   * Generate cache key for an embedding\n   */\n  private getCacheKey(text: string, model: EmbeddingModel): string {\n    // Simple hash function for the cache key\n    const hash = this.simpleHash(text)\n    return `${model}:${hash}`\n  }\n\n  /**\n   * Simple hash function for cache keys\n   */\n  private simpleHash(str: string): string {\n    let hash = 0\n    for (let i = 0; i < str.length; i++) {\n      const char = str.charCodeAt(i)\n      hash = (hash << 5) - hash + char\n      hash = hash & hash // Convert to 32bit integer\n    }\n    return Math.abs(hash).toString(36)\n  }\n\n  /**\n   * Check if a cache entry is expired\n   */\n  private isCacheExpired(entry: EmbeddingCacheEntry): boolean {\n    if (!entry.ttl) {\n      return false\n    }\n\n    return Date.now() - entry.cachedAt > entry.ttl\n  }\n\n  /**\n   * Update average embedding time\n   */\n  private updateAvgEmbeddingTime(duration: number): void {\n    const totalTime =\n      (this.stats.avgEmbeddingTime || 0) * (this.stats.totalEmbeddings - 1) +\n      duration\n    this.stats.avgEmbeddingTime = totalTime / this.stats.totalEmbeddings\n  }\n\n  /**\n   * Update cache hit rate\n   */\n  private updateCacheHitRate(): void {\n    const totalRequests = this.stats.totalEmbeddings\n    const cacheSize = this.embeddingCache.size\n\n    if (totalRequests > 0) {\n      this.stats.cacheHitRate = cacheSize / totalRequests\n    }\n  }\n\n  /**\n   * Get search statistics\n   */\n  getStats(): SearchStats {\n    return { ...this.stats }\n  }\n\n  /**\n   * Clear the embedding cache\n   */\n  clearCache(): void {\n    this.embeddingCache.clear()\n  }\n\n  /**\n   * Get the current cache size\n   */\n  getCacheSize(): number {\n    return this.embeddingCache.size\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 * Rate Limiter for AI Kit\n * Implements multiple rate limiting algorithms with flexible storage backends\n */\n\nimport type {\n  RateLimiterConfig,\n  RateLimitCheckOptions,\n  RateLimitResult,\n  RateLimitStorage,\n  RateLimitRule,\n  RequestCost,\n  RateLimiterStats,\n} from './types';\nimport {\n  RateLimitAlgorithm,\n  RateLimitScope,\n  RateLimitAction,\n  StorageBackend,\n} from './types';\n\n/**\n * In-memory storage implementation\n */\nclass MemoryStorage implements RateLimitStorage {\n  private store: Map<string, { value: any; expiry?: number }> = new Map();\n  private lists: Map<string, any[]> = new Map();\n\n  async get(key: string): Promise<any> {\n    const entry = this.store.get(key);\n    if (!entry) return null;\n    if (entry.expiry && Date.now() > entry.expiry) {\n      this.store.delete(key);\n      return null;\n    }\n    return entry.value;\n  }\n\n  async set(key: string, value: any, ttl?: number): Promise<void> {\n    const expiry = ttl ? Date.now() + ttl : undefined;\n    this.store.set(key, { value, expiry });\n  }\n\n  async increment(key: string, amount: number = 1): Promise<number> {\n    const current = (await this.get(key)) || 0;\n    const newValue = current + amount;\n    await this.set(key, newValue);\n    return newValue;\n  }\n\n  async delete(key: string): Promise<void> {\n    this.store.delete(key);\n    this.lists.delete(key);\n  }\n\n  async mget(keys: string[]): Promise<any[]> {\n    return Promise.all(keys.map((key) => this.get(key)));\n  }\n\n  async mset(entries: Array<[string, any]>, ttl?: number): Promise<void> {\n    for (const [key, value] of entries) {\n      await this.set(key, value, ttl);\n    }\n  }\n\n  async lpush(key: string, value: any): Promise<number> {\n    const list = this.lists.get(key) || [];\n    list.unshift(value);\n    this.lists.set(key, list);\n    return list.length;\n  }\n\n  async lrange(key: string, start: number, stop: number): Promise<any[]> {\n    const list = this.lists.get(key) || [];\n    return list.slice(start, stop === -1 ? undefined : stop + 1);\n  }\n\n  async lrem(key: string, count: number, value: any): Promise<number> {\n    const list = this.lists.get(key) || [];\n    let removed = 0;\n    const newList = list.filter((item) => {\n      if (removed < Math.abs(count) && item === value) {\n        removed++;\n        return false;\n      }\n      return true;\n    });\n    this.lists.set(key, newList);\n    return removed;\n  }\n\n  async llen(key: string): Promise<number> {\n    const list = this.lists.get(key) || [];\n    return list.length;\n  }\n\n  async expire(key: string, ttl: number): Promise<void> {\n    const entry = this.store.get(key);\n    if (entry) {\n      entry.expiry = Date.now() + ttl;\n    }\n  }\n\n  // Cleanup expired entries\n  cleanup(): void {\n    const now = Date.now();\n    for (const [key, entry] of this.store.entries()) {\n      if (entry.expiry && now > entry.expiry) {\n        this.store.delete(key);\n      }\n    }\n  }\n}\n\n/**\n * Redis storage implementation (optional)\n */\nclass RedisStorage implements RateLimitStorage {\n  // @ts-ignore - Reserved for future Redis client implementation\n  // @ts-ignore - Reserved for future Redis client\n  private _client: any;\n\n  // @ts-ignore - Stub implementation parameter intentionally unused\n  constructor(_options: { host: string; port: number; password?: string; db?: number }) {\n    // This would be implemented with an actual Redis client\n    // For now, we'll throw an error to indicate Redis support needs to be added\n    throw new Error(\n      'Redis storage backend not yet implemented. Please use MEMORY backend or contribute Redis support.'\n    );\n  }\n\n  // @ts-ignore - Stub implementation parameter intentionally unused\n  async get(_key: string): Promise<any> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async set(_key: string, _value: any, _ttl?: number): Promise<void> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async increment(_key: string, _amount?: number): Promise<number> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameter intentionally unused\n  async delete(_key: string): Promise<void> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameter intentionally unused\n  async mget(_keys: string[]): Promise<any[]> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async mset(_entries: Array<[string, any]>, _ttl?: number): Promise<void> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async lpush(_key: string, _value: any): Promise<number> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async lrange(_key: string, _start: number, _stop: number): Promise<any[]> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async lrem(_key: string, _count: number, _value: any): Promise<number> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameter intentionally unused\n  async llen(_key: string): Promise<number> {\n    throw new Error('Not implemented');\n  }\n\n  // @ts-ignore - Stub implementation parameters intentionally unused\n  async expire(_key: string, _ttl: number): Promise<void> {\n    throw new Error('Not implemented');\n  }\n}\n\n/**\n * Main RateLimiter class\n */\nexport class RateLimiter {\n  private storage: RateLimitStorage;\n  private config: RateLimiterConfig;\n  private keyPrefix: string;\n  private stats: RateLimiterStats;\n  private cleanupInterval?: NodeJS.Timeout;\n\n  constructor(config: RateLimiterConfig) {\n    this.config = config;\n    this.keyPrefix = config.keyPrefix || 'ratelimit';\n\n    // Initialize storage backend\n    if (config.storage === StorageBackend.REDIS) {\n      if (!config.redis) {\n        throw new Error('Redis configuration required when using Redis backend');\n      }\n      this.storage = new RedisStorage(config.redis);\n    } else {\n      this.storage = new MemoryStorage();\n      // Setup cleanup for memory storage\n      this.cleanupInterval = setInterval(() => {\n        if (this.storage instanceof MemoryStorage) {\n          this.storage.cleanup();\n        }\n      }, 60000); // Cleanup every minute\n    }\n\n    // Initialize stats\n    this.stats = {\n      totalRequests: 0,\n      allowed: 0,\n      blocked: 0,\n      queued: 0,\n    };\n  }\n\n  /**\n   * Check if a request should be allowed\n   */\n  async check(options: RateLimitCheckOptions): Promise<RateLimitResult> {\n    this.stats.totalRequests++;\n\n    const rules = this.config.rules[options.scope] || [];\n    if (rules.length === 0) {\n      // No rules, allow by default\n      return {\n        allowed: true,\n        limit: Infinity,\n        remaining: Infinity,\n        resetAt: 0,\n      };\n    }\n\n    // Check all rules and return the most restrictive result\n    const results = await Promise.all(\n      rules.map((rule) => this.checkRule(options, rule))\n    );\n\n    // Find the most restrictive result (first one that blocks)\n    const blockedResult = results.find((r) => !r.allowed);\n    if (blockedResult) {\n      this.stats.blocked++;\n      return blockedResult;\n    }\n\n    // All rules passed, return the most restrictive allowed result\n    this.stats.allowed++;\n    const mostRestrictive = results.reduce((min, curr) =>\n      curr.remaining < min.remaining ? curr : min\n    );\n    return mostRestrictive;\n  }\n\n  /**\n   * Check a single rule\n   */\n  private async checkRule(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    switch (rule.algorithm) {\n      case RateLimitAlgorithm.TOKEN_BUCKET:\n        return this.checkTokenBucket(options, rule);\n      case RateLimitAlgorithm.FIXED_WINDOW:\n        return this.checkFixedWindow(options, rule);\n      case RateLimitAlgorithm.SLIDING_WINDOW:\n        return this.checkSlidingWindow(options, rule);\n      case RateLimitAlgorithm.LEAKY_BUCKET:\n        return this.checkLeakyBucket(options, rule);\n      case RateLimitAlgorithm.COST_BASED:\n        return this.checkCostBased(options, rule);\n      default:\n        throw new Error(`Unknown algorithm: ${rule.algorithm}`);\n    }\n  }\n\n  /**\n   * Token bucket algorithm\n   * Allows bursts up to bucket capacity, refills at a steady rate\n   */\n  private async checkTokenBucket(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    const key = this.getKey(options.scope, options.identifier, 'token_bucket');\n    const tokens = options.tokens || 1;\n    const capacity = rule.burst || rule.limit;\n    const refillRate = rule.refillRate || rule.limit / (rule.window / 1000);\n\n    // Get current bucket state\n    const bucketData = await this.storage.get(key);\n    const now = Date.now();\n\n    let currentTokens: number;\n    let lastRefill: number;\n\n    if (!bucketData) {\n      currentTokens = capacity;\n      lastRefill = now;\n    } else {\n      const { tokens: storedTokens, lastRefill: storedLastRefill } = JSON.parse(bucketData);\n      const timePassed = (now - storedLastRefill) / 1000;\n      const tokensToAdd = timePassed * refillRate;\n      currentTokens = Math.min(capacity, storedTokens + tokensToAdd);\n      lastRefill = now;\n    }\n\n    if (currentTokens >= tokens) {\n      // Allow request\n      const newTokens = currentTokens - tokens;\n      await this.storage.set(\n        key,\n        JSON.stringify({ tokens: newTokens, lastRefill }),\n        rule.window\n      );\n\n      return {\n        allowed: true,\n        limit: capacity,\n        remaining: Math.floor(newTokens),\n        resetAt: now + (capacity - newTokens) / refillRate * 1000,\n      };\n    } else {\n      // Reject request\n      const retryAfter = ((tokens - currentTokens) / refillRate) * 1000;\n      return {\n        allowed: false,\n        limit: capacity,\n        remaining: Math.floor(currentTokens),\n        resetAt: now + retryAfter,\n        retryAfter: Math.ceil(retryAfter),\n        action: rule.action || RateLimitAction.REJECT,\n      };\n    }\n  }\n\n  /**\n   * Fixed window counter\n   * Simple time-based windows with reset at window boundaries\n   */\n  private async checkFixedWindow(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    const now = Date.now();\n    const windowStart = Math.floor(now / rule.window) * rule.window;\n    const windowEnd = windowStart + rule.window;\n    const key = this.getKey(options.scope, options.identifier, `fixed_${windowStart}`);\n\n    const current = (await this.storage.get(key)) || 0;\n\n    if (current < rule.limit) {\n      // Allow request\n      const newCount = await this.storage.increment(key);\n      await this.storage.expire(key, rule.window);\n\n      return {\n        allowed: true,\n        limit: rule.limit,\n        remaining: rule.limit - newCount,\n        resetAt: windowEnd,\n        totalRequests: newCount,\n      };\n    } else {\n      // Reject request\n      return {\n        allowed: false,\n        limit: rule.limit,\n        remaining: 0,\n        resetAt: windowEnd,\n        retryAfter: windowEnd - now,\n        totalRequests: current,\n        action: rule.action || RateLimitAction.REJECT,\n      };\n    }\n  }\n\n  /**\n   * Sliding window log\n   * Maintains a log of timestamps for precise rate limiting\n   */\n  private async checkSlidingWindow(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    const key = this.getKey(options.scope, options.identifier, 'sliding_window');\n    const now = Date.now();\n    const windowStart = now - rule.window;\n\n    // Get all timestamps in the current window\n    const timestamps = await this.storage.lrange(key, 0, -1);\n\n    // Filter out old timestamps\n    const validTimestamps = timestamps.filter((ts: number) => ts > windowStart);\n\n    if (validTimestamps.length < rule.limit) {\n      // Allow request\n      await this.storage.lpush(key, now);\n      await this.storage.expire(key, rule.window);\n\n      // Clean up old entries periodically\n      if (timestamps.length > rule.limit * 2) {\n        for (const ts of timestamps) {\n          if (ts <= windowStart) {\n            await this.storage.lrem(key, 1, ts);\n          }\n        }\n      }\n\n      const oldestTimestamp = validTimestamps.length > 0\n        ? Math.min(...validTimestamps)\n        : now;\n\n      return {\n        allowed: true,\n        limit: rule.limit,\n        remaining: rule.limit - validTimestamps.length - 1,\n        resetAt: oldestTimestamp + rule.window,\n        totalRequests: validTimestamps.length + 1,\n      };\n    } else {\n      // Reject request\n      const oldestTimestamp = Math.min(...validTimestamps);\n      const retryAfter = oldestTimestamp + rule.window - now;\n\n      return {\n        allowed: false,\n        limit: rule.limit,\n        remaining: 0,\n        resetAt: oldestTimestamp + rule.window,\n        retryAfter: Math.ceil(retryAfter),\n        totalRequests: validTimestamps.length,\n        action: rule.action || RateLimitAction.REJECT,\n      };\n    }\n  }\n\n  /**\n   * Leaky bucket algorithm\n   * Processes requests at a constant rate\n   */\n  private async checkLeakyBucket(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    const key = this.getKey(options.scope, options.identifier, 'leaky_bucket');\n    const now = Date.now();\n    const capacity = rule.limit;\n    const leakRate = rule.refillRate || rule.limit / (rule.window / 1000);\n\n    // Get current bucket state\n    const bucketData = await this.storage.get(key);\n\n    let currentLevel: number;\n    let lastLeak: number;\n\n    if (!bucketData) {\n      currentLevel = 0;\n      lastLeak = now;\n    } else {\n      const { level, lastLeak: storedLastLeak } = JSON.parse(bucketData);\n      const timePassed = (now - storedLastLeak) / 1000;\n      const leaked = timePassed * leakRate;\n      currentLevel = Math.max(0, level - leaked);\n      lastLeak = now;\n    }\n\n    if (currentLevel < capacity) {\n      // Allow request\n      const newLevel = currentLevel + 1;\n      await this.storage.set(\n        key,\n        JSON.stringify({ level: newLevel, lastLeak }),\n        rule.window\n      );\n\n      return {\n        allowed: true,\n        limit: capacity,\n        remaining: Math.floor(capacity - newLevel),\n        resetAt: now + (newLevel / leakRate) * 1000,\n      };\n    } else {\n      // Reject request\n      const retryAfter = ((currentLevel - capacity + 1) / leakRate) * 1000;\n      return {\n        allowed: false,\n        limit: capacity,\n        remaining: 0,\n        resetAt: now + (currentLevel / leakRate) * 1000,\n        retryAfter: Math.ceil(retryAfter),\n        action: rule.action || RateLimitAction.REJECT,\n      };\n    }\n  }\n\n  /**\n   * Cost-based rate limiting\n   * Tracks usage by cost (tokens, dollars, etc.)\n   */\n  private async checkCostBased(\n    options: RateLimitCheckOptions,\n    rule: RateLimitRule\n  ): Promise<RateLimitResult> {\n    const key = this.getKey(options.scope, options.identifier, 'cost_based');\n    const now = Date.now();\n    const windowStart = Math.floor(now / rule.window) * rule.window;\n    const windowEnd = windowStart + rule.window;\n\n    // Calculate cost of this request\n    const cost = this.calculateCost(options.cost, rule.costPerRequest);\n\n    const currentCost = (await this.storage.get(key)) || 0;\n\n    if (currentCost + cost <= rule.limit) {\n      // Allow request\n      const newCost = currentCost + cost;\n      await this.storage.set(key, newCost, rule.window);\n\n      return {\n        allowed: true,\n        limit: rule.limit,\n        remaining: rule.limit - newCost,\n        resetAt: windowEnd,\n        costConsumed: newCost,\n        metadata: options.cost,\n      };\n    } else {\n      // Reject request\n      return {\n        allowed: false,\n        limit: rule.limit,\n        remaining: rule.limit - currentCost,\n        resetAt: windowEnd,\n        retryAfter: windowEnd - now,\n        costConsumed: currentCost,\n        metadata: options.cost,\n        action: rule.action || RateLimitAction.REJECT,\n      };\n    }\n  }\n\n  /**\n   * Calculate cost from RequestCost object\n   */\n  private calculateCost(requestCost?: RequestCost, costPerRequest: number = 1): number {\n    if (!requestCost) return costPerRequest;\n\n    // Prioritize custom cost, then monetary cost, then token count\n    if (requestCost.customCost !== undefined) return requestCost.customCost;\n    if (requestCost.cost !== undefined) return requestCost.cost;\n    if (requestCost.totalTokens !== undefined) return requestCost.totalTokens;\n    if (requestCost.inputTokens !== undefined && requestCost.outputTokens !== undefined) {\n      return requestCost.inputTokens + requestCost.outputTokens;\n    }\n\n    return costPerRequest;\n  }\n\n  /**\n   * Generate storage key\n   */\n  private getKey(scope: RateLimitScope, identifier: string, suffix: string): string {\n    return `${this.keyPrefix}:${scope}:${identifier}:${suffix}`;\n  }\n\n  /**\n   * Reset rate limits for an identifier\n   */\n  async reset(scope: RateLimitScope, identifier: string): Promise<void> {\n    const patterns = [\n      'token_bucket',\n      'fixed_*',\n      'sliding_window',\n      'leaky_bucket',\n      'cost_based',\n    ];\n\n    for (const pattern of patterns) {\n      const key = this.getKey(scope, identifier, pattern);\n      await this.storage.delete(key);\n    }\n  }\n\n  /**\n   * Get current statistics\n   */\n  getStats(): RateLimiterStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Reset statistics\n   */\n  resetStats(): void {\n    this.stats = {\n      totalRequests: 0,\n      allowed: 0,\n      blocked: 0,\n      queued: 0,\n    };\n  }\n\n  /**\n   * Cleanup and close connections\n   */\n  async close(): Promise<void> {\n    if (this.cleanupInterval) {\n      clearInterval(this.cleanupInterval);\n    }\n  }\n\n  /**\n   * Get remaining limit for an identifier\n   */\n  async getRemaining(\n    scope: RateLimitScope,\n    identifier: string,\n    algorithm: RateLimitAlgorithm = RateLimitAlgorithm.FIXED_WINDOW\n  ): Promise<number> {\n    const rules = this.config.rules[scope] || [];\n    const rule = rules.find((r) => r.algorithm === algorithm);\n\n    if (!rule) return Infinity;\n\n    const result = await this.checkRule({ identifier, scope }, rule);\n    return result.remaining;\n  }\n}\n\n// Export for convenience\nexport * from './types';\n"]}