{"version":3,"file":"pipeline.mjs","sources":["../src/omegasynth/store/SyntheticFieldStore.ts","../src/omegasynth/generators/RetrievalGenerator.ts","../src/omegasynth/encoders/CharVocab.ts","../src/omegasynth/encoders/FixedLength.ts","../src/omegasynth/encoders/OneHot.ts","../src/omegasynth/encoders/StringEncoder.ts","../src/omegasynth/core/elm_utils.ts","../src/omegasynth/core/validation.ts","../src/omegasynth/core/PatternCorrector.ts","../src/omegasynth/core/SequenceContext.ts","../src/omegasynth/generators/ELMGenerator.ts","../src/omegasynth/generators/HybridGenerator.ts","../src/omegasynth/generators/ExactGenerator.ts","../src/omegasynth/generators/PerfectGenerator.ts","../node_modules/@astermindai/license-runtime/dist/base64url.js","../node_modules/@astermindai/license-runtime/dist/joseSignature.js","../node_modules/@astermindai/license-runtime/dist/time.js","../node_modules/@astermindai/license-runtime/dist/jwksCache.js","../node_modules/@astermindai/license-runtime/dist/verifyLktClient.js","../node_modules/@astermindai/license-runtime/dist/runtime.js","../node_modules/@astermindai/license-runtime/dist/index.js","../src/omegasynth/core/license.ts","../src/omegasynth/OmegaSynth.ts","../src/omegasynth/scripts/loadTrainingData.ts","../src/omegasynth/scripts/trainModel.ts","../src/omegasynth/evaluation/Metrics.ts","../src/omegasynth/scripts/testModel.ts","../src/omegasynth/scripts/validateModel.ts","../src/omegasynth/scripts/saveVersionedModel.ts","../src/omegasynth/scripts/pipeline.ts"],"sourcesContent":["/**\n * SyntheticFieldStore - Storage for labeled samples\n * Supports insert, get, and sample operations\n */\n\nimport { LabeledSample } from '../types';\n\nexport class SyntheticFieldStore {\n  private store: Map<string, string[]> = new Map();\n\n  /**\n   * Insert a labeled sample into the store\n   */\n  insert(sample: LabeledSample): void {\n    if (!this.store.has(sample.label)) {\n      this.store.set(sample.label, []);\n    }\n    this.store.get(sample.label)!.push(sample.value);\n  }\n\n  /**\n   * Insert multiple samples at once\n   */\n  insertMany(samples: LabeledSample[]): void {\n    for (const sample of samples) {\n      this.insert(sample);\n    }\n  }\n\n  /**\n   * Get all values for a given label\n   */\n  get(label: string): string[] {\n    return this.store.get(label) || [];\n  }\n\n  /**\n   * Sample k values uniformly at random for a given label\n   */\n  sample(label: string, k: number = 1): string[] {\n    const values = this.get(label);\n    if (values.length === 0) {\n      return [];\n    }\n\n    const result: string[] = [];\n    const indices = new Set<number>();\n\n    // Simple uniform random sampling without replacement\n    while (result.length < k && indices.size < values.length) {\n      const idx = Math.floor(Math.random() * values.length);\n      if (!indices.has(idx)) {\n        indices.add(idx);\n        result.push(values[idx]);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Check if a label exists in the store\n   */\n  hasLabel(label: string): boolean {\n    return this.store.has(label);\n  }\n\n  /**\n   * Get all labels in the store\n   */\n  getLabels(): string[] {\n    return Array.from(this.store.keys());\n  }\n\n  /**\n   * Get the count of samples for a label\n   */\n  count(label: string): number {\n    return this.get(label).length;\n  }\n\n  /**\n   * Clear all data\n   */\n  clear(): void {\n    this.store.clear();\n  }\n}\n\n\n\n","/**\n * RetrievalGenerator - Simple deterministic retrieval sampler\n * Uniform random sampling from stored labeled samples\n */\n\nimport { SyntheticFieldStore } from '../store/SyntheticFieldStore';\nimport { LabeledSample } from '../types';\n\n/**\n * Seeded random number generator for deterministic testing\n */\nclass SeededRNG {\n  private seed: number;\n\n  constructor(seed: number = Date.now()) {\n    this.seed = seed;\n  }\n\n  next(): number {\n    // Linear congruential generator\n    this.seed = (this.seed * 1664525 + 1013904223) % 2 ** 32;\n    return this.seed / 2 ** 32;\n  }\n\n  setSeed(seed: number): void {\n    this.seed = seed;\n  }\n}\n\nexport class RetrievalGenerator {\n  private store: SyntheticFieldStore;\n  private rng: SeededRNG;\n  private seed?: number;\n\n  constructor(seed?: number) {\n    this.store = new SyntheticFieldStore();\n    this.seed = seed;\n    this.rng = new SeededRNG(seed);\n  }\n\n  /**\n   * Ingest labeled samples into the store\n   */\n  ingest(samples: LabeledSample[]): void {\n    this.store.insertMany(samples);\n  }\n\n  /**\n   * Sample k values for a given label\n   * Returns empty array if label doesn't exist or has no samples\n   */\n  sample(label: string, k: number = 1): string[] {\n    const values = this.store.get(label);\n    if (values.length === 0) {\n      return [];\n    }\n\n    const result: string[] = [];\n    const availableIndices = Array.from({ length: values.length }, (_, i) => i);\n\n    // Sample k values (or all if k > available)\n    const sampleCount = Math.min(k, values.length);\n    for (let i = 0; i < sampleCount; i++) {\n      const randomIndex = Math.floor(this.rng.next() * availableIndices.length);\n      const selectedIndex = availableIndices.splice(randomIndex, 1)[0];\n      result.push(values[selectedIndex]);\n    }\n\n    return result;\n  }\n\n  /**\n   * Get a single sample (convenience method)\n   */\n  sampleOne(label: string): string | null {\n    const samples = this.sample(label, 1);\n    return samples.length > 0 ? samples[0] : null;\n  }\n\n  /**\n   * Check if a label has samples\n   */\n  hasLabel(label: string): boolean {\n    return this.store.hasLabel(label) && this.store.count(label) > 0;\n  }\n\n  /**\n   * Get all available labels\n   */\n  getLabels(): string[] {\n    return this.store.getLabels();\n  }\n\n  /**\n   * Reset the generator (clears store and optionally resets seed)\n   */\n  reset(seed?: number): void {\n    this.store.clear();\n    if (seed !== undefined) {\n      this.seed = seed;\n      this.rng.setSeed(seed);\n    }\n  }\n}\n\n\n","/**\n * CharVocab - Character vocabulary builder\n * Builds a vocabulary from character sets and training data\n */\n\nexport class CharVocab {\n  private charToIndex: Map<string, number> = new Map();\n  private indexToChar: Map<number, string> = new Map();\n  private size: number = 0;\n\n  /**\n   * Build vocabulary from a set of strings\n   * @param samples Array of strings to build vocabulary from\n   * @param charSet Optional predefined character set (e.g., alphanumeric + punctuation)\n   */\n  build(samples: string[], charSet?: string): void {\n    const chars = new Set<string>();\n\n    // Add padding character first (index 0) - use null character\n    // This ensures index 0 is always padding\n    chars.add('\\0');\n\n    // Add predefined character set if provided\n    if (charSet) {\n      for (const char of charSet) {\n        // Skip null character if it's in the charSet (we already added it)\n        if (char !== '\\0') {\n          chars.add(char);\n        }\n      }\n    }\n\n    // Add all characters from samples\n    for (const sample of samples) {\n      for (const char of sample) {\n        // Skip null characters from samples (we use it for padding)\n        if (char !== '\\0') {\n          chars.add(char);\n        }\n      }\n    }\n\n    // Sort characters for consistent ordering, but keep null char at index 0\n    const sortedChars = Array.from(chars).sort((a, b) => {\n      // Ensure null char is always first\n      if (a === '\\0') return -1;\n      if (b === '\\0') return 1;\n      return a.localeCompare(b);\n    });\n\n    // Build mappings\n    this.charToIndex.clear();\n    this.indexToChar.clear();\n    this.size = sortedChars.length;\n\n    sortedChars.forEach((char, index) => {\n      this.charToIndex.set(char, index);\n      this.indexToChar.set(index, char);\n    });\n  }\n\n  /**\n   * Get index for a character\n   */\n  getIndex(char: string): number {\n    const index = this.charToIndex.get(char);\n    if (index === undefined) {\n      throw new Error(`Character '${char}' not in vocabulary`);\n    }\n    return index;\n  }\n\n  /**\n   * Get character for an index\n   */\n  getChar(index: number): string {\n    const char = this.indexToChar.get(index);\n    if (char === undefined) {\n      throw new Error(`Index ${index} not in vocabulary`);\n    }\n    return char;\n  }\n\n  /**\n   * Check if character exists in vocabulary\n   */\n  hasChar(char: string): boolean {\n    return this.charToIndex.has(char);\n  }\n\n  /**\n   * Get vocabulary size\n   */\n  getSize(): number {\n    return this.size;\n  }\n\n  /**\n   * Get all characters in vocabulary\n   */\n  getChars(): string[] {\n    return Array.from(this.charToIndex.keys()).sort();\n  }\n\n  /**\n   * Get default character set (alphanumeric + common punctuation)\n   */\n  static getDefaultCharSet(): string {\n    return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' +\n           ' !\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~';\n  }\n}\n\n","/**\n * FixedLength - Utilities for fixed-length padding and truncation\n */\n\nexport class FixedLength {\n  /**\n   * Pad or truncate an array to a fixed length\n   * @param arr Array to pad/truncate\n   * @param length Target length\n   * @param padValue Value to use for padding (default: 0)\n   */\n  static padOrTruncate<T>(arr: T[], length: number, padValue: T = 0 as T): T[] {\n    if (arr.length === length) {\n      return [...arr];\n    }\n\n    if (arr.length > length) {\n      // Truncate\n      return arr.slice(0, length);\n    }\n\n    // Pad\n    const result = [...arr];\n    while (result.length < length) {\n      result.push(padValue);\n    }\n    return result;\n  }\n\n  /**\n   * Pad or truncate a string to a fixed length\n   * @param str String to pad/truncate\n   * @param length Target length\n   * @param padChar Character to use for padding (default: space)\n   */\n  static padOrTruncateString(str: string, length: number, padChar: string = ' '): string {\n    if (str.length === length) {\n      return str;\n    }\n\n    if (str.length > length) {\n      // Truncate\n      return str.slice(0, length);\n    }\n\n    // Pad\n    return str + padChar.repeat(length - str.length);\n  }\n}\n\n\n\n","/**\n * OneHot - One-hot encoding utilities\n */\n\nexport class OneHot {\n  /**\n   * Encode an index as a one-hot vector\n   * @param index Index to encode\n   * @param size Size of the one-hot vector\n   */\n  static encode(index: number, size: number): number[] {\n    if (index < 0 || index >= size) {\n      throw new Error(`Index ${index} out of range [0, ${size})`);\n    }\n\n    const vector = new Array(size).fill(0);\n    vector[index] = 1;\n    return vector;\n  }\n\n  /**\n   * Decode a one-hot vector to an index\n   * @param vector One-hot vector\n   */\n  static decode(vector: number[]): number {\n    const index = vector.indexOf(1);\n    if (index === -1) {\n      throw new Error('Invalid one-hot vector: no element equals 1');\n    }\n    return index;\n  }\n\n  /**\n   * Encode multiple indices as one-hot vectors\n   * @param indices Array of indices\n   * @param size Size of each one-hot vector\n   */\n  static encodeBatch(indices: number[], size: number): number[][] {\n    return indices.map(idx => this.encode(idx, size));\n  }\n\n  /**\n   * Decode multiple one-hot vectors to indices\n   * @param vectors Array of one-hot vectors\n   */\n  static decodeBatch(vectors: number[][]): number[] {\n    return vectors.map(vec => this.decode(vec));\n  }\n}\n\n\n\n","/**\n * StringEncoder - Encodes strings to vectors and decodes back\n * Compatible with ELM/KELM pipelines\n */\n\nimport { CharVocab } from './CharVocab';\nimport { FixedLength } from './FixedLength';\nimport { OneHot } from './OneHot';\n\nexport interface StringEncoderConfig {\n  maxLength: number;\n  charSet?: string;\n  useOneHot?: boolean; // If false, uses index-based encoding\n}\n\nexport class StringEncoder {\n  private vocab: CharVocab;\n  private config: StringEncoderConfig;\n\n  constructor(config: StringEncoderConfig) {\n    this.config = {\n      useOneHot: false, // Default to index-based for efficiency\n      ...config,\n    };\n    this.vocab = new CharVocab();\n  }\n\n  /**\n   * Build vocabulary from training samples\n   */\n  buildVocab(samples: string[]): void {\n    this.vocab.build(samples, this.config.charSet || CharVocab.getDefaultCharSet());\n  }\n\n  /**\n   * Encode a string to a vector\n   * @param str String to encode\n   * @returns Encoded vector (either indices or one-hot)\n   */\n  encode(str: string): number[] {\n    if (this.vocab.getSize() === 0) {\n      throw new Error('Vocabulary not built. Call buildVocab() first.');\n    }\n\n    // Convert string to indices\n    const indices: number[] = [];\n    for (const char of str) {\n      if (this.vocab.hasChar(char)) {\n        indices.push(this.vocab.getIndex(char));\n      } else {\n        // For unknown characters, try to find a similar one or use space\n        // If space is in vocab, use it; otherwise use 0 (which will be treated as padding)\n        if (this.vocab.hasChar(' ')) {\n          indices.push(this.vocab.getIndex(' '));\n        } else {\n          indices.push(0);\n        }\n      }\n    }\n\n    // Pad or truncate to fixed length\n    const padded = FixedLength.padOrTruncate(\n      indices,\n      this.config.maxLength,\n      0\n    );\n\n    // Convert to one-hot if requested\n    if (this.config.useOneHot) {\n      const vocabSize = this.vocab.getSize();\n      const oneHotVectors: number[] = [];\n      for (const idx of padded) {\n        oneHotVectors.push(...OneHot.encode(idx, vocabSize));\n      }\n      return oneHotVectors;\n    }\n\n    return padded;\n  }\n\n  /**\n   * Decode a vector back to a string\n   * @param vector Encoded vector\n   * @returns Decoded string\n   */\n  decode(vector: number[]): string {\n    if (this.vocab.getSize() === 0) {\n      throw new Error('Vocabulary not built. Call buildVocab() first.');\n    }\n\n    let indices: number[];\n\n    if (this.config.useOneHot) {\n      // Decode one-hot vectors\n      const vocabSize = this.vocab.getSize();\n      indices = [];\n      for (let i = 0; i < vector.length; i += vocabSize) {\n        const oneHot = vector.slice(i, i + vocabSize);\n        try {\n          indices.push(OneHot.decode(oneHot));\n        } catch {\n          // If decoding fails, use argmax as fallback\n          const maxIdx = oneHot.indexOf(Math.max(...oneHot));\n          indices.push(maxIdx);\n        }\n      }\n      // Truncate to maxLength\n      indices = indices.slice(0, this.config.maxLength);\n    } else {\n      // Direct index-based decoding\n      indices = vector.slice(0, this.config.maxLength);\n    }\n\n    // Convert indices to characters, stopping at first padding\n    let result = '';\n    const vocabSize = this.vocab.getSize();\n    const paddingIdx = 0; // Padding is always index 0\n    \n    for (const idx of indices) {\n      // Clamp index to valid range\n      const clampedIdx = Math.max(0, Math.min(vocabSize - 1, Math.round(idx)));\n      \n      // Stop decoding at first padding index (0)\n      if (clampedIdx === paddingIdx) {\n        break;\n      }\n      \n      // Try to get character for this index\n      try {\n        const char = this.vocab.getChar(clampedIdx);\n        // Skip null characters and control characters (except space, tab, newline)\n        if (char === '\\0' || (char.charCodeAt(0) < 32 && char !== ' ' && char !== '\\t' && char !== '\\n')) {\n          break; // Stop at first invalid character\n        }\n        result += char;\n      } catch {\n        // Invalid index - stop decoding\n        break;\n      }\n    }\n\n    // Trim trailing whitespace but preserve internal spaces\n    return result.trimEnd();\n  }\n\n  /**\n   * Encode multiple strings\n   */\n  encodeBatch(strings: string[]): number[][] {\n    return strings.map(str => this.encode(str));\n  }\n\n  /**\n   * Decode multiple vectors\n   */\n  decodeBatch(vectors: number[][]): string[] {\n    return vectors.map(vec => this.decode(vec));\n  }\n\n  /**\n   * Get the output vector size\n   */\n  getVectorSize(): number {\n    if (this.config.useOneHot) {\n      return this.config.maxLength * this.vocab.getSize();\n    }\n    return this.config.maxLength;\n  }\n\n  /**\n   * Get vocabulary size\n   */\n  getVocabSize(): number {\n    return this.vocab.getSize();\n  }\n\n  /**\n   * Get vocabulary\n   */\n  getVocab(): CharVocab {\n    return this.vocab;\n  }\n}\n\n","/**\n * ELM utilities for OmegaSynth\n * Helper functions for working with ELM models\n */\n\n/**\n * Create one-hot vector for a label index\n */\nexport function oneHotLabel(labelIndex: number, numLabels: number): number[] {\n  const vector = new Array(numLabels).fill(0);\n  if (labelIndex >= 0 && labelIndex < numLabels) {\n    vector[labelIndex] = 1;\n  }\n  return vector;\n}\n\n/**\n * Generate random noise vector\n */\nexport function generateNoiseVector(size: number, seed?: number): number[] {\n  const rng = seed !== undefined ? new SeededRNG(seed) : null;\n  const noise: number[] = [];\n  for (let i = 0; i < size; i++) {\n    const value = rng ? rng.next() : Math.random();\n    // Normalize to [-1, 1]\n    noise.push(value * 2 - 1);\n  }\n  return noise;\n}\n\n/**\n * Seeded random number generator\n */\nclass SeededRNG {\n  private seed: number;\n\n  constructor(seed: number) {\n    this.seed = seed;\n  }\n\n  next(): number {\n    this.seed = (this.seed * 1664525 + 1013904223) % 2 ** 32;\n    return this.seed / 2 ** 32;\n  }\n}\n\n\n\n","/**\n * Label-specific validation and cleaning utilities\n */\n\nexport interface ValidationResult {\n  isValid: boolean;\n  cleaned: string;\n  reason?: string;\n}\n\n/**\n * Validate and clean a generated string based on its label type\n */\nexport function validateForLabel(label: string, value: string): ValidationResult {\n  if (!value || value.length === 0) {\n    return { isValid: false, cleaned: '', reason: 'Empty value' };\n  }\n\n  // Get label-specific validator\n  const validator = getValidatorForLabel(label);\n  return validator(value);\n}\n\n/**\n * Get validator function for a specific label\n */\nfunction getValidatorForLabel(label: string): (value: string) => ValidationResult {\n  switch (label) {\n    case 'first_name':\n    case 'last_name':\n      return validateName;\n    case 'phone_number':\n      return validatePhoneNumber;\n    case 'email':\n      return validateEmail;\n    case 'street_address':\n      return validateStreetAddress;\n    case 'city':\n    case 'state':\n    case 'country':\n      return validateLocation;\n    case 'company_name':\n    case 'job_title':\n    case 'product_name':\n      return validateText;\n    case 'color':\n      return validateColor;\n    case 'uuid':\n      return validateUUID;\n    case 'date':\n      return validateDate;\n    case 'credit_card_type':\n    case 'device_type':\n      return validateText;\n    default:\n      return validateGeneric;\n  }\n}\n\n/**\n * Validate name (first_name, last_name)\n * Rules: Letters only, optional hyphens/apostrophes, no numbers\n */\nfunction validateName(value: string): ValidationResult {\n  // First check for placeholder patterns in original value (before cleaning)\n  const lowerOriginal = value.toLowerCase();\n  // Reject \"Name\" followed by numbers (e.g., \"Name97\", \"name123\")\n  if (/^name\\d+$/i.test(value)) {\n    return { isValid: false, cleaned: '', reason: 'Placeholder name with numbers' };\n  }\n  \n  // Remove all non-letter characters except hyphens and apostrophes\n  let cleaned = value.replace(/[^a-zA-Z\\-\\'\\s]/g, '');\n  \n  // Remove numbers completely\n  cleaned = cleaned.replace(/[0-9]/g, '');\n  \n  // Remove excessive special characters\n  cleaned = cleaned.replace(/[-']{2,}/g, '-'); // Multiple hyphens/apostrophes -> single\n  cleaned = cleaned.replace(/^[-']+|[-']+$/g, ''); // Remove leading/trailing\n  \n  // Trim and normalize whitespace\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  // Must be at least 2 characters and contain at least one letter\n  if (cleaned.length < 2 || !/[a-zA-Z]/.test(cleaned)) {\n    return { isValid: false, cleaned: '', reason: 'Too short or no letters' };\n  }\n  \n  // Reject common placeholder names (case-insensitive) after cleaning\n  const lowerCleaned = cleaned.toLowerCase();\n  // Check for exact matches\n  if (lowerCleaned === 'name' || lowerCleaned === 'firstname' || lowerCleaned === 'lastname' || \n      lowerCleaned === 'surname') {\n    return { isValid: false, cleaned: '', reason: 'Placeholder name' };\n  }\n  // Check for \"name\" followed by very short variations\n  if (lowerCleaned.startsWith('name') && lowerCleaned.length <= 6) {\n    return { isValid: false, cleaned: '', reason: 'Placeholder name' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 30) {\n    cleaned = cleaned.substring(0, 30).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate phone number\n * Rules: Digits, dashes, parentheses, dots, plus, spaces\n */\nfunction validatePhoneNumber(value: string): ValidationResult {\n  // Keep only valid phone characters\n  let cleaned = value.replace(/[^0-9\\-\\+\\(\\)\\.\\s]/g, '');\n  \n  // Remove excessive special characters\n  cleaned = cleaned.replace(/[-\\.]{2,}/g, '-');\n  cleaned = cleaned.replace(/\\s+/g, ' ');\n  cleaned = cleaned.trim();\n  \n  // Count digits\n  const digitCount = (cleaned.match(/\\d/g) || []).length;\n  \n  // Must have at least 7 digits (minimum phone number)\n  if (digitCount < 7) {\n    return { isValid: false, cleaned: '', reason: 'Too few digits' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 25) {\n    cleaned = cleaned.substring(0, 25).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate email\n * Rules: Must contain @, valid characters before and after\n */\nfunction validateEmail(value: string): ValidationResult {\n  // Keep valid email characters\n  let cleaned = value.replace(/[^a-zA-Z0-9@\\.\\-\\_]/g, '');\n  \n  // Must contain @\n  if (!cleaned.includes('@')) {\n    return { isValid: false, cleaned: '', reason: 'Missing @ symbol' };\n  }\n  \n  const parts = cleaned.split('@');\n  if (parts.length !== 2) {\n    return { isValid: false, cleaned: '', reason: 'Invalid @ usage' };\n  }\n  \n  const [local, domain] = parts;\n  \n  // Local part must have at least 1 character\n  if (!local || local.length === 0) {\n    return { isValid: false, cleaned: '', reason: 'Empty local part' };\n  }\n  \n  // Domain must have at least 3 characters (x.y)\n  if (!domain || domain.length < 3) {\n    return { isValid: false, cleaned: '', reason: 'Invalid domain' };\n  }\n  \n  // Domain must contain at least one dot\n  if (!domain.includes('.')) {\n    return { isValid: false, cleaned: '', reason: 'Domain missing dot' };\n  }\n  \n  // Remove leading/trailing dots and hyphens\n  const cleanLocal = local.replace(/^[\\.\\-]+|[\\.\\-]+$/g, '');\n  const cleanDomain = domain.replace(/^[\\.\\-]+|[\\.\\-]+$/g, '');\n  \n  if (!cleanLocal || !cleanDomain) {\n    return { isValid: false, cleaned: '', reason: 'Invalid format after cleaning' };\n  }\n  \n  cleaned = `${cleanLocal}@${cleanDomain}`;\n  \n  // Max length check\n  if (cleaned.length > 50) {\n    cleaned = cleaned.substring(0, 50);\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate street address\n * Rules: Numbers, letters, spaces, common address characters\n */\nfunction validateStreetAddress(value: string): ValidationResult {\n  // Keep valid address characters\n  let cleaned = value.replace(/[^a-zA-Z0-9\\s\\-\\#\\.\\,]/g, '');\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  // Must have at least 5 characters\n  if (cleaned.length < 5) {\n    return { isValid: false, cleaned: '', reason: 'Too short' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 50) {\n    cleaned = cleaned.substring(0, 50).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate location (city, state, country)\n * Rules: Mostly letters, optional spaces/hyphens\n */\nfunction validateLocation(value: string): ValidationResult {\n  // Keep letters, spaces, hyphens, apostrophes\n  let cleaned = value.replace(/[^a-zA-Z\\s\\-\\']/g, '');\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  // Must have at least 2 characters and contain letters\n  if (cleaned.length < 2 || !/[a-zA-Z]/.test(cleaned)) {\n    return { isValid: false, cleaned: '', reason: 'Too short or no letters' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 30) {\n    cleaned = cleaned.substring(0, 30).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate text (company_name, job_title, product_name)\n * Rules: Letters, numbers, spaces, common punctuation\n */\nfunction validateText(value: string): ValidationResult {\n  // Keep alphanumeric and common punctuation\n  let cleaned = value.replace(/[^a-zA-Z0-9\\s\\-\\'\\.\\,]/g, '');\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  // Must have at least 2 characters\n  if (cleaned.length < 2) {\n    return { isValid: false, cleaned: '', reason: 'Too short' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 50) {\n    cleaned = cleaned.substring(0, 50).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate color\n * Rules: Letters only, maybe spaces\n */\nfunction validateColor(value: string): ValidationResult {\n  // Keep letters and spaces only\n  let cleaned = value.replace(/[^a-zA-Z\\s]/g, '');\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  // Must have at least 3 characters\n  if (cleaned.length < 3) {\n    return { isValid: false, cleaned: '', reason: 'Too short' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 20) {\n    cleaned = cleaned.substring(0, 20).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate UUID\n * Rules: Should follow UUID format (8-4-4-4-12 hex digits with dashes)\n */\nfunction validateUUID(value: string): ValidationResult {\n  // Keep hex characters and dashes\n  let cleaned = value.replace(/[^0-9a-fA-F\\-]/g, '');\n  \n  // Try to format as UUID if it has enough characters\n  const hexOnly = cleaned.replace(/-/g, '');\n  if (hexOnly.length >= 32) {\n    // Format as UUID: 8-4-4-4-12\n    const formatted = [\n      hexOnly.substring(0, 8),\n      hexOnly.substring(8, 12),\n      hexOnly.substring(12, 16),\n      hexOnly.substring(16, 20),\n      hexOnly.substring(20, 32)\n    ].join('-');\n    cleaned = formatted;\n  }\n  \n  // Must have at least 32 hex characters\n  const hexCount = cleaned.replace(/-/g, '').length;\n  if (hexCount < 32) {\n    return { isValid: false, cleaned: '', reason: 'Too few hex characters' };\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Validate date\n * Rules: Should follow date format (YYYY-MM-DD or similar)\n */\nfunction validateDate(value: string): ValidationResult {\n  // Keep digits, dashes, slashes\n  let cleaned = value.replace(/[^0-9\\-\\/]/g, '');\n  \n  // Must have at least 8 digits (YYYYMMDD)\n  const digitCount = (cleaned.match(/\\d/g) || []).length;\n  if (digitCount < 8) {\n    return { isValid: false, cleaned: '', reason: 'Too few digits' };\n  }\n  \n  // Max length check\n  if (cleaned.length > 20) {\n    cleaned = cleaned.substring(0, 20).trim();\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n/**\n * Generic validator for unknown labels\n */\nfunction validateGeneric(value: string): ValidationResult {\n  // Remove control characters\n  let cleaned = value.replace(/[\\x00-\\x1F\\x7F]/g, '');\n  cleaned = cleaned.trim().replace(/\\s+/g, ' ');\n  \n  if (cleaned.length < 1) {\n    return { isValid: false, cleaned: '', reason: 'Empty after cleaning' };\n  }\n  \n  return { isValid: true, cleaned };\n}\n\n","/**\n * PatternCorrector - Post-processing pattern matching and correction\n * Learns patterns from training data and applies them to generated samples\n */\n\nimport { LabeledSample } from '../types';\n\nexport interface Pattern {\n  label: string;\n  examples: string[];\n  commonPrefixes: string[];\n  commonSuffixes: string[];\n  charFrequency: Map<string, number>;\n  lengthDistribution: number[];\n}\n\nexport class PatternCorrector {\n  private patterns: Map<string, Pattern> = new Map();\n\n  /**\n   * Learn patterns from training data\n   */\n  learnPatterns(samples: LabeledSample[]): void {\n    const byLabel = new Map<string, string[]>();\n    \n    // Group samples by label\n    for (const sample of samples) {\n      if (!byLabel.has(sample.label)) {\n        byLabel.set(sample.label, []);\n      }\n      byLabel.get(sample.label)!.push(sample.value);\n    }\n\n    // Learn patterns for each label\n    for (const [label, values] of byLabel.entries()) {\n      this.learnPattern(label, values);\n    }\n  }\n\n  /**\n   * Learn pattern for a specific label\n   */\n  private learnPattern(label: string, examples: string[]): void {\n    if (examples.length === 0) return;\n\n    // Extract common prefixes (first 1-3 characters)\n    const prefixCounts = new Map<string, number>();\n    const suffixCounts = new Map<string, number>();\n    const charFreq = new Map<string, number>();\n    const lengths: number[] = [];\n\n    for (const example of examples) {\n      lengths.push(example.length);\n      \n      // Prefixes\n      for (let len = 1; len <= Math.min(3, example.length); len++) {\n        const prefix = example.substring(0, len);\n        prefixCounts.set(prefix, (prefixCounts.get(prefix) || 0) + 1);\n      }\n      \n      // Suffixes\n      for (let len = 1; len <= Math.min(3, example.length); len++) {\n        const suffix = example.substring(example.length - len);\n        suffixCounts.set(suffix, (suffixCounts.get(suffix) || 0) + 1);\n      }\n      \n      // Character frequency\n      for (const char of example) {\n        charFreq.set(char, (charFreq.get(char) || 0) + 1);\n      }\n    }\n\n    // Get common prefixes (appear in >10% of examples - lowered from 20% for better pattern matching)\n    const commonPrefixes = Array.from(prefixCounts.entries())\n      .filter(([_, count]) => count / examples.length > 0.1)\n      .sort((a, b) => b[1] - a[1])\n      .slice(0, 15) // Increased from 10 to 15\n      .map(([prefix]) => prefix);\n\n    // Get common suffixes (appear in >10% of examples - lowered from 20% for better pattern matching)\n    const commonSuffixes = Array.from(suffixCounts.entries())\n      .filter(([_, count]) => count / examples.length > 0.1)\n      .sort((a, b) => b[1] - a[1])\n      .slice(0, 15) // Increased from 10 to 15\n      .map(([suffix]) => suffix);\n\n    // Normalize character frequencies\n    const totalChars = Array.from(charFreq.values()).reduce((a, b) => a + b, 0);\n    for (const [char, count] of charFreq.entries()) {\n      charFreq.set(char, count / totalChars);\n    }\n\n    this.patterns.set(label, {\n      label,\n      examples,\n      commonPrefixes,\n      commonSuffixes,\n      charFrequency: charFreq,\n      lengthDistribution: lengths,\n    });\n  }\n\n  /**\n   * Correct a generated string using learned patterns\n   */\n  correct(generated: string, label: string): string {\n    const pattern = this.patterns.get(label);\n    if (!pattern) {\n      return generated; // No pattern learned, return as-is\n    }\n\n    let corrected = generated;\n\n    // 1. Check if it matches a known example (exact match)\n    if (pattern.examples.includes(generated)) {\n      return generated; // Already perfect\n    }\n\n    // 2. Check prefix/suffix patterns\n    const hasValidPrefix = pattern.commonPrefixes.some(prefix => \n      corrected.toLowerCase().startsWith(prefix.toLowerCase())\n    );\n    const hasValidSuffix = pattern.commonSuffixes.some(suffix => \n      corrected.toLowerCase().endsWith(suffix.toLowerCase())\n    );\n\n    // 3. If no valid prefix, try to fix it\n    if (!hasValidPrefix && pattern.commonPrefixes.length > 0) {\n      const mostCommonPrefix = pattern.commonPrefixes[0];\n      // Only fix if the generated string is very different\n      if (corrected.length > 0 && !corrected.toLowerCase().startsWith(mostCommonPrefix[0].toLowerCase())) {\n        // Don't change, but note it for scoring\n      }\n    }\n\n    // 4. Check character frequency (remove unlikely characters)\n    const charFreq = pattern.charFrequency;\n    let cleaned = '';\n    for (const char of corrected) {\n      const freq = charFreq.get(char) || 0;\n      // Keep character if it appears in >0.5% of training data (lowered from 1%), or if it's common (space, etc.)\n      if (freq > 0.005 || /[a-zA-Z0-9\\s]/.test(char)) {\n        cleaned += char;\n      }\n    }\n    if (cleaned.length > 0) {\n      corrected = cleaned;\n    }\n\n    // 5. Check length distribution\n    const avgLength = pattern.lengthDistribution.reduce((a, b) => a + b, 0) / pattern.lengthDistribution.length;\n    const minLength = Math.min(...pattern.lengthDistribution);\n    const maxLength = Math.max(...pattern.lengthDistribution);\n    \n    // Truncate if too long\n    if (corrected.length > maxLength * 1.5) {\n      corrected = corrected.substring(0, Math.floor(maxLength * 1.2));\n    }\n\n    return corrected;\n  }\n\n  /**\n   * Score how well a generated string matches the pattern\n   */\n  score(generated: string, label: string): number {\n    const pattern = this.patterns.get(label);\n    if (!pattern) {\n      return 0.5; // Unknown pattern, neutral score\n    }\n\n    let score = 0;\n    let factors = 0;\n\n    // 1. Exact match bonus\n    if (pattern.examples.includes(generated)) {\n      return 1.0; // Perfect match\n    }\n\n    // 2. Prefix match (30% weight)\n    const prefixMatch = pattern.commonPrefixes.some(prefix => \n      generated.toLowerCase().startsWith(prefix.toLowerCase())\n    );\n    score += prefixMatch ? 0.3 : 0;\n    factors++;\n\n    // 3. Suffix match (20% weight)\n    const suffixMatch = pattern.commonSuffixes.some(suffix => \n      generated.toLowerCase().endsWith(suffix.toLowerCase())\n    );\n    score += suffixMatch ? 0.2 : 0;\n    factors++;\n\n    // 4. Character frequency match (30% weight)\n    const charFreq = pattern.charFrequency;\n    let charScore = 0;\n    let charCount = 0;\n    for (const char of generated) {\n      const freq = charFreq.get(char) || 0;\n      charScore += freq;\n      charCount++;\n    }\n    score += (charCount > 0 ? charScore / charCount : 0) * 0.3;\n    factors++;\n\n    // 5. Length match (20% weight)\n    const avgLength = pattern.lengthDistribution.reduce((a, b) => a + b, 0) / pattern.lengthDistribution.length;\n    const lengthDiff = Math.abs(generated.length - avgLength) / avgLength;\n    const lengthScore = Math.max(0, 1 - lengthDiff);\n    score += lengthScore * 0.2;\n    factors++;\n\n    return factors > 0 ? score / factors : 0;\n  }\n\n  /**\n   * Get pattern for a label\n   */\n  getPattern(label: string): Pattern | undefined {\n    return this.patterns.get(label);\n  }\n}\n\n","/**\n * SequenceContext - Add sequence context to generation\n * Uses previous characters to inform next character prediction\n */\n\nexport class SequenceContext {\n  private ngramPatterns: Map<string, Map<string, number>> = new Map();\n  private n: number; // n-gram size\n\n  constructor(n: number = 3) {\n    this.n = n;\n  }\n\n  /**\n   * Learn n-gram patterns from training data\n   */\n  learnPatterns(samples: string[]): void {\n    this.ngramPatterns.clear();\n    \n    for (const sample of samples) {\n      // Extract n-grams\n      for (let i = 0; i <= sample.length - this.n; i++) {\n        const ngram = sample.substring(i, i + this.n - 1); // Context (n-1 chars)\n        const nextChar = sample[i + this.n - 1]; // Next character\n        \n        if (!this.ngramPatterns.has(ngram)) {\n          this.ngramPatterns.set(ngram, new Map());\n        }\n        \n        const charMap = this.ngramPatterns.get(ngram)!;\n        charMap.set(nextChar, (charMap.get(nextChar) || 0) + 1);\n      }\n    }\n  }\n\n  /**\n   * Get next character probabilities given context\n   */\n  getNextCharProbs(context: string): Map<string, number> {\n    // Use last n-1 characters as context\n    const ctx = context.length >= this.n - 1 \n      ? context.substring(context.length - (this.n - 1))\n      : context;\n    \n    const charCounts = this.ngramPatterns.get(ctx);\n    if (!charCounts || charCounts.size === 0) {\n      return new Map();\n    }\n    \n    // Convert counts to probabilities\n    const total = Array.from(charCounts.values()).reduce((a, b) => a + b, 0);\n    const probs = new Map<string, number>();\n    \n    for (const [char, count] of charCounts.entries()) {\n      probs.set(char, count / total);\n    }\n    \n    return probs;\n  }\n\n  /**\n   * Suggest next character based on context\n   */\n  suggestNextChar(context: string): string | null {\n    const probs = this.getNextCharProbs(context);\n    if (probs.size === 0) {\n      return null;\n    }\n    \n    // Return most likely character\n    let bestChar = '';\n    let bestProb = 0;\n    \n    for (const [char, prob] of probs.entries()) {\n      if (prob > bestProb) {\n        bestProb = prob;\n        bestChar = char;\n      }\n    }\n    \n    return bestChar;\n  }\n\n  /**\n   * Score how well a character fits the context\n   */\n  scoreChar(context: string, char: string): number {\n    const probs = this.getNextCharProbs(context);\n    return probs.get(char) || 0;\n  }\n}\n\n","/**\n * ELMGenerator - Label-conditioned string generator using ELM\n * Trains an ELM to generate encoded strings based on labels + noise\n */\n\nimport { ELM } from '@astermind/astermind-elm';\nimport { StringEncoder } from '../encoders/StringEncoder';\nimport { LabeledSample } from '../types';\nimport { oneHotLabel, generateNoiseVector } from '../core/elm_utils';\nimport { validateForLabel } from '../core/validation';\nimport { PatternCorrector } from '../core/PatternCorrector';\nimport { SequenceContext } from '../core/SequenceContext';\n\n// Type definitions - ELM will be available at runtime from AsterMind\n// Using any for now to allow runtime import from dist or external package\ntype ELMConfig = {\n  useTokenizer: false;\n  inputSize: number;\n  categories: string[];\n  hiddenUnits: number;\n  activation?: 'tanh' | 'relu' | 'leakyrelu' | 'sigmoid' | 'linear' | 'gelu';\n  ridgeLambda?: number;\n  task?: 'classification' | 'regression';\n};\n\ntype ELMModel = {\n  trainFromData(X: number[][], Y: number[] | number[][], options?: any): any;\n  predictLogitsFromVector(vec: number[]): number[];\n  predictProbaFromVector?(vec: number[]): number[]; // For classification\n};\n\nexport interface ELMGeneratorConfig {\n  maxLength: number;\n  hiddenUnits?: number;\n  activation?: 'tanh' | 'relu' | 'leakyrelu' | 'sigmoid' | 'linear' | 'gelu';\n  ridgeLambda?: number;\n  noiseSize?: number; // Size of noise vector\n  seed?: number;\n  useOneHot?: boolean; // Use one-hot encoding (better for classification)\n  useClassification?: boolean; // Use classification instead of regression\n  usePatternCorrection?: boolean; // Apply pattern-based correction\n}\n\nexport class ELMGenerator {\n  private encoder: StringEncoder;\n  private elm: ELMModel | null = null;\n  private labels: string[] = [];\n  private config: ELMGeneratorConfig;\n  private noiseSize: number;\n  private patternCorrector: PatternCorrector | null = null;\n  private sequenceContext: SequenceContext | null = null;\n  private useClassification: boolean;\n\n  constructor(config: ELMGeneratorConfig) {\n    this.config = {\n      hiddenUnits: 128,\n      activation: 'relu',\n      ridgeLambda: 0.01,\n      noiseSize: 32,\n      useOneHot: false, // Default to false for memory efficiency (can enable for better accuracy)\n      useClassification: false, // Default to regression for compatibility\n      usePatternCorrection: true,\n      ...config,\n    };\n    this.noiseSize = this.config.noiseSize!;\n    this.useClassification = this.config.useClassification!;\n    this.encoder = new StringEncoder({\n      maxLength: config.maxLength,\n      useOneHot: this.config.useOneHot ?? false, // Default to false for memory efficiency\n    });\n    \n    if (this.config.usePatternCorrection) {\n      this.patternCorrector = new PatternCorrector();\n    }\n    \n    // Always use sequence context for better generation\n    this.sequenceContext = new SequenceContext(3); // 3-grams\n  }\n\n  /**\n   * Train the ELM generator on labeled samples\n   */\n  train(samples: LabeledSample[]): void {\n    if (samples.length === 0) {\n      throw new Error('Cannot train on empty dataset');\n    }\n\n    // Extract unique labels\n    const uniqueLabels = Array.from(new Set(samples.map(s => s.label)));\n    this.labels = uniqueLabels;\n\n    // Extract all values for vocabulary building\n    const allValues = samples.map(s => s.value);\n    this.encoder.buildVocab(allValues);\n    \n    // Learn patterns if pattern correction is enabled\n    if (this.patternCorrector) {\n      this.patternCorrector.learnPatterns(samples);\n    }\n    \n    // Learn sequence context\n    if (this.sequenceContext) {\n      this.sequenceContext.learnPatterns(allValues);\n    }\n\n    // Build training data\n    const X: number[][] = [];\n    const Y: number[][] = [];\n\n    for (const sample of samples) {\n      const labelIndex = this.labels.indexOf(sample.label);\n      if (labelIndex === -1) {\n        continue;\n      }\n\n      // Input: concat(oneHot(label), noiseVector)\n      const labelOneHot = oneHotLabel(labelIndex, this.labels.length);\n      const noise = generateNoiseVector(this.noiseSize, this.config.seed);\n      const inputVector = [...labelOneHot, ...noise];\n      X.push(inputVector);\n\n      // Target: encoded(value)\n      const encodedValue = this.encoder.encode(sample.value);\n      Y.push(encodedValue);\n    }\n\n    if (X.length === 0) {\n      throw new Error('No valid training samples after processing');\n    }\n\n    // Create ELM config\n    const inputSize = this.labels.length + this.noiseSize;\n    const outputSize = this.encoder.getVectorSize();\n\n    const elmConfig: ELMConfig = {\n      useTokenizer: false, // Numeric mode\n      inputSize: inputSize,\n      categories: this.useClassification ? [] : [], // For classification, we'll handle it differently\n      hiddenUnits: this.config.hiddenUnits!,\n      activation: this.config.activation!,\n      // Use lower regularization for better pattern learning\n      ridgeLambda: this.config.ridgeLambda! * 0.1, // Reduce regularization\n      task: this.useClassification ? 'classification' : 'regression',\n    };\n\n    // Create and train ELM - resolve constructor robustly across CJS/ESM shapes\n    // Replace dynamic require with direct constructor\n    this.elm = new (ELM as any)(elmConfig) as unknown as ELMModel;\n    this.elm.trainFromData(X, Y);\n  }\n\n  /**\n   * Generate a string for a given label\n   * @param label Label to generate for\n   * @param noiseSeed Optional seed for noise generation (for deterministic output)\n   */\n  generate(label: string, noiseSeed?: number): string {\n    if (!this.elm) {\n      throw new Error('Model not trained. Call train() first.');\n    }\n\n    const labelIndex = this.labels.indexOf(label);\n    if (labelIndex === -1) {\n      throw new Error(`Label '${label}' not found in training data`);\n    }\n\n    // Create input: concat(oneHot(label), noiseVector)\n    const labelOneHot = oneHotLabel(labelIndex, this.labels.length);\n    const noise = generateNoiseVector(\n      this.noiseSize,\n      noiseSeed !== undefined ? noiseSeed : this.config.seed\n    );\n    const inputVector = [...labelOneHot, ...noise];\n\n    // Predict based on mode\n    let decoded: string;\n    \n    if (this.useClassification && this.config.useOneHot && typeof (this.elm as any).predictProbaFromVector === 'function') {\n      // Classification mode with one-hot: use probabilities\n      const vocabSize = this.encoder.getVocabSize();\n      const maxLength = this.config.maxLength;\n      const vectorSize = vocabSize * maxLength;\n      \n      // Get probabilities for each position\n      const probs = (this.elm as any).predictProbaFromVector(inputVector);\n      \n      // Reshape to [maxLength, vocabSize] and use argmax\n      const indices: number[] = [];\n      for (let pos = 0; pos < maxLength; pos++) {\n        const posProbs = probs.slice(pos * vocabSize, (pos + 1) * vocabSize);\n        const maxIdx = posProbs.indexOf(Math.max(...posProbs));\n        indices.push(maxIdx);\n      }\n      \n      decoded = this.encoder.decode(indices);\n    } else {\n      // Regression mode: use logits and round\n      const prediction = this.elm.predictLogitsFromVector(inputVector);\n      \n      // Convert logits to indices with proper quantization\n      const vocabSize = this.encoder.getVocabSize();\n      const indices = prediction.map(val => {\n        // Clamp value to reasonable range first (prevent extreme values)\n        const clamped = Math.max(-vocabSize, Math.min(vocabSize * 2, val));\n        // Round to nearest integer\n        const rounded = Math.round(clamped);\n        // Clamp to valid vocabulary range [0, vocabSize-1]\n        const idx = Math.max(0, Math.min(vocabSize - 1, rounded));\n        return idx;\n      });\n      \n      decoded = this.encoder.decode(indices);\n    }\n    \n    // Apply pattern correction if enabled\n    let corrected = decoded;\n    if (this.patternCorrector) {\n      corrected = this.patternCorrector.correct(decoded, label);\n    }\n    \n    // Apply sequence context refinement\n    if (this.sequenceContext && corrected.length > 0) {\n      corrected = this.refineWithSequenceContext(corrected, label);\n    }\n    \n    // Validate and clean the decoded string using label-specific rules\n    const validation = validateForLabel(label, corrected);\n    \n    // If validation fails, try to generate again with different noise (up to 3 attempts)\n    if (!validation.isValid) {\n      for (let attempt = 0; attempt < 3; attempt++) {\n        const baseSeed = noiseSeed !== undefined ? noiseSeed : (this.config.seed ?? Date.now());\n        const newNoise = generateNoiseVector(\n          this.noiseSize, baseSeed + attempt + 1000\n        );\n        const newInputVector = [...labelOneHot, ...newNoise];\n        \n        let newDecoded: string;\n        if (this.useClassification && this.config.useOneHot && typeof (this.elm as any).predictProbaFromVector === 'function') {\n          const vocabSize = this.encoder.getVocabSize();\n          const maxLength = this.config.maxLength;\n          const probs = (this.elm as any).predictProbaFromVector(newInputVector);\n          const newIndices: number[] = [];\n          for (let pos = 0; pos < maxLength; pos++) {\n            const posProbs = probs.slice(pos * vocabSize, (pos + 1) * vocabSize);\n            const maxIdx = posProbs.indexOf(Math.max(...posProbs));\n            newIndices.push(maxIdx);\n          }\n          newDecoded = this.encoder.decode(newIndices);\n        } else {\n          const newPrediction = this.elm.predictLogitsFromVector(newInputVector);\n          const vocabSize = this.encoder.getVocabSize();\n          const newIndices = newPrediction.map(val => {\n            const clamped = Math.max(-vocabSize, Math.min(vocabSize * 2, val));\n            const rounded = Math.round(clamped);\n            return Math.max(0, Math.min(vocabSize - 1, rounded));\n          });\n          newDecoded = this.encoder.decode(newIndices);\n        }\n        \n        // Apply pattern correction\n        if (this.patternCorrector) {\n          newDecoded = this.patternCorrector.correct(newDecoded, label);\n        }\n        \n        const newValidation = validateForLabel(label, newDecoded);\n        if (newValidation.isValid) {\n          return newValidation.cleaned;\n        }\n      }\n      // If all attempts fail, return empty string\n      return '';\n    }\n    \n    return validation.cleaned;\n  }\n\n  /**\n   * Generate multiple strings for a label with confidence-based selection\n   */\n  generateBatch(label: string, count: number): string[] {\n    const candidates: Array<{ value: string; score: number }> = [];\n    const seen = new Set<string>();\n    let attempts = 0;\n    const maxAttempts = count * 10; // Allow up to 10x attempts to get valid unique samples\n    \n    // Generate candidates with scoring\n    while (attempts < maxAttempts) {\n      const seed = this.config.seed !== undefined \n        ? this.config.seed + attempts \n        : Date.now() + attempts;\n      \n      try {\n        const generated = this.generate(label, seed);\n        \n        if (generated && generated.length > 0 && !seen.has(generated.toLowerCase())) {\n          // Score the candidate\n          let score = 1.0;\n          \n          // Pattern match score\n          if (this.patternCorrector) {\n            score = this.patternCorrector.score(generated, label);\n          }\n          \n          // Validation score (valid = 1.0, invalid = 0.0)\n          const validation = validateForLabel(label, generated);\n          if (!validation.isValid) {\n            score = 0;\n          }\n          \n          candidates.push({ value: generated, score });\n          seen.add(generated.toLowerCase());\n        }\n      } catch (error) {\n        // Skip errors\n      }\n      \n      attempts++;\n    }\n    \n    // Sort by score and return top candidates\n    candidates.sort((a, b) => b.score - a.score);\n    return candidates.slice(0, count).map(c => c.value);\n  }\n\n  /**\n   * Refine generated string using sequence context\n   */\n  private refineWithSequenceContext(generated: string, label: string): string {\n    if (!this.sequenceContext || generated.length === 0) {\n      return generated;\n    }\n    \n    // Try to improve the string by checking sequence context\n    let refined = '';\n    for (let i = 0; i < generated.length; i++) {\n      const context = refined; // Use what we've built so far\n      const currentChar = generated[i];\n      \n      // Check if current char fits the context\n      const contextScore = this.sequenceContext.scoreChar(context, currentChar);\n      \n      // If score is very low, try to suggest better character\n      if (contextScore < 0.1 && context.length > 0) {\n        const suggested = this.sequenceContext.suggestNextChar(context);\n        if (suggested && suggested !== currentChar) {\n          // Only replace if it's a significant improvement\n          refined += suggested;\n        } else {\n          refined += currentChar;\n        }\n      } else {\n        refined += currentChar;\n      }\n      \n      // Stop if we hit padding or invalid character\n      if (currentChar === '\\0' || currentChar.charCodeAt(0) === 0) {\n        break;\n      }\n    }\n    \n    return refined;\n  }\n\n  /**\n   * Get all trained labels\n   */\n  getLabels(): string[] {\n    return [...this.labels];\n  }\n\n  /**\n   * Check if model is trained\n   */\n  isTrained(): boolean {\n    return this.elm !== null;\n  }\n}\n\n","/**\n * HybridGenerator - Blends Retrieval + ELM jitter for realism + variation\n * 1. Retrieve real sample\n * 2. Encode\n * 3. Apply ELM noise\n * 4. Decode\n */\n\nimport { RetrievalGenerator } from './RetrievalGenerator';\nimport { ELMGenerator } from './ELMGenerator';\nimport { StringEncoder } from '../encoders/StringEncoder';\nimport { LabeledSample } from '../types';\nimport { validateForLabel } from '../core/validation';\nimport { PatternCorrector } from '../core/PatternCorrector';\n\nexport interface HybridGeneratorConfig {\n  maxLength: number;\n  elmHiddenUnits?: number;\n  elmActivation?: 'tanh' | 'relu' | 'leakyrelu' | 'sigmoid' | 'linear' | 'gelu';\n  elmRidgeLambda?: number;\n  noiseSize?: number;\n  jitterStrength?: number; // How much to jitter (0-1)\n  exactMode?: boolean; // If true, jitterStrength is set to 0\n  useOneHot?: boolean;\n  useClassification?: boolean;\n  usePatternCorrection?: boolean;\n  seed?: number;\n}\n\nexport class HybridGenerator {\n  private retrieval: RetrievalGenerator;\n  private elm: ELMGenerator;\n  private encoder: StringEncoder;\n  private config: HybridGeneratorConfig;\n  private jitterStrength: number;\n  private patternCorrector: PatternCorrector | null = null;\n\n  constructor(config: HybridGeneratorConfig) {\n    this.config = {\n      elmHiddenUnits: 128,\n      elmActivation: 'relu',\n      elmRidgeLambda: 0.01,\n      noiseSize: 32,\n      jitterStrength: 0.05, // 5% jitter by default (reduced for better realism)\n      exactMode: false,\n      useOneHot: false, // Default to false for memory efficiency\n      useClassification: false,\n      usePatternCorrection: true,\n      ...config,\n    };\n    \n    // If exact mode, set jitter to 0\n    if (this.config.exactMode) {\n      this.jitterStrength = 0;\n    } else {\n      this.jitterStrength = this.config.jitterStrength!;\n    }\n\n    this.retrieval = new RetrievalGenerator(config.seed);\n    this.elm = new ELMGenerator({\n      maxLength: config.maxLength,\n      hiddenUnits: this.config.elmHiddenUnits,\n      activation: this.config.elmActivation,\n      ridgeLambda: this.config.elmRidgeLambda,\n      noiseSize: this.config.noiseSize,\n      useOneHot: this.config.useOneHot,\n      useClassification: this.config.useClassification,\n      usePatternCorrection: this.config.usePatternCorrection,\n      seed: config.seed,\n    });\n\n    this.encoder = new StringEncoder({\n      maxLength: config.maxLength,\n      useOneHot: this.config.useOneHot ?? false, // Default to false for memory efficiency\n    });\n    \n    if (this.config.usePatternCorrection) {\n      this.patternCorrector = new PatternCorrector();\n    }\n  }\n\n  /**\n   * Train the hybrid generator on labeled samples\n   */\n  train(samples: LabeledSample[]): void {\n    // Train retrieval\n    this.retrieval.ingest(samples);\n\n    // Build encoder vocabulary\n    const allValues = samples.map(s => s.value);\n    this.encoder.buildVocab(allValues);\n\n    // Train ELM for jittering\n    this.elm.train(samples);\n    \n    // Learn patterns if pattern correction is enabled\n    if (this.patternCorrector) {\n      this.patternCorrector.learnPatterns(samples);\n    }\n  }\n\n  /**\n   * Generate a hybrid sample (retrieval + jitter)\n   * @param label Label to generate for\n   * @param noiseSeed Optional seed for deterministic output\n   */\n  generate(label: string, noiseSeed?: number): string {\n    // Step 1: Retrieve real sample\n    const retrieved = this.retrieval.sampleOne(label);\n    if (!retrieved) {\n      // Fallback to pure ELM if no retrieval available\n      return this.elm.generate(label, noiseSeed);\n    }\n\n    // Step 2: Encode\n    const encoded = this.encoder.encode(retrieved);\n\n    // Step 3: Apply ELM noise/jitter\n    // Generate a jittered version using ELM\n    const jittered = this.applyJitter(encoded, label, noiseSeed);\n\n    // Step 4: Decode\n    const decoded = this.encoder.decode(jittered);\n    \n    // Step 5: Apply pattern correction if enabled\n    let corrected = decoded;\n    if (this.patternCorrector) {\n      corrected = this.patternCorrector.correct(decoded, label);\n    }\n    \n    // Step 6: Validate and clean using label-specific rules\n    const validation = validateForLabel(label, corrected);\n    \n    // If validation fails, try jittering again with different noise (up to 2 attempts)\n    if (!validation.isValid) {\n      for (let attempt = 0; attempt < 2; attempt++) {\n        const newSeed = noiseSeed !== undefined ? noiseSeed + attempt + 1000 : undefined;\n        const newJittered = this.applyJitter(encoded, label, newSeed);\n        const newDecoded = this.encoder.decode(newJittered);\n        let newCorrected = newDecoded;\n        if (this.patternCorrector) {\n          newCorrected = this.patternCorrector.correct(newDecoded, label);\n        }\n        const newValidation = validateForLabel(label, newCorrected);\n        if (newValidation.isValid) {\n          return newValidation.cleaned;\n        }\n      }\n      // If all attempts fail, return original (retrieved is always valid)\n      return retrieved;\n    }\n    \n    return validation.cleaned;\n  }\n\n  /**\n   * Apply jitter to an encoded vector\n   */\n  private applyJitter(encoded: number[], label: string, noiseSeed?: number): number[] {\n    // Generate ELM output for the label\n    const elmOutput = this.generateELMVector(label, noiseSeed);\n\n    // If ELM output is empty or invalid, return original (no jitter)\n    if (!elmOutput || elmOutput.length === 0 || elmOutput.every(v => v === 0)) {\n      return encoded;\n    }\n\n    // Blend: (1 - jitterStrength) * original + jitterStrength * elmOutput\n    // Use smaller jitter to preserve more of the original\n    const effectiveJitter = Math.min(this.jitterStrength, 0.05); // Cap at 5% jitter\n    const jittered = encoded.map((val, idx) => {\n      const elmVal = elmOutput[idx] || 0;\n      return (1 - effectiveJitter) * val + effectiveJitter * elmVal;\n    });\n\n    // Convert blended continuous values to integer indices\n    // Round and clamp to valid vocabulary range\n    const vocabSize = this.encoder.getVocabSize();\n    const indices = jittered.map(val => {\n      // Clamp value first\n      const clamped = Math.max(0, Math.min(vocabSize - 1, val));\n      const idx = Math.round(clamped);\n      return Math.max(0, Math.min(vocabSize - 1, idx));\n    });\n\n    return indices;\n  }\n\n  /**\n   * Generate an ELM vector for jittering\n   */\n  private generateELMVector(label: string, noiseSeed?: number): number[] {\n    try {\n      // Try to get ELM prediction\n      const elmGenerated = this.elm.generate(label, noiseSeed);\n      // Only encode if we got a non-empty string\n      if (elmGenerated && elmGenerated.length > 0) {\n        return this.encoder.encode(elmGenerated);\n      }\n      // If empty, return zero vector (no jitter)\n      return new Array(this.encoder.getVectorSize()).fill(0);\n    } catch {\n      // If ELM fails, return zero vector (no jitter)\n      return new Array(this.encoder.getVectorSize()).fill(0);\n    }\n  }\n\n  /**\n   * Generate multiple hybrid samples\n   */\n  generateBatch(label: string, count: number): string[] {\n    const results: string[] = [];\n    const seen = new Set<string>();\n    let attempts = 0;\n    const maxAttempts = count * 5; // Allow up to 5x attempts to get valid unique samples\n    \n    while (results.length < count && attempts < maxAttempts) {\n      const seed = this.config.seed !== undefined \n        ? this.config.seed + attempts \n        : Date.now() + attempts;\n      const generated = this.generate(label, seed);\n      \n      // Only add if valid, non-empty, and unique\n      if (generated && generated.length > 0 && !seen.has(generated.toLowerCase())) {\n        results.push(generated);\n        seen.add(generated.toLowerCase());\n      }\n      attempts++;\n    }\n    \n    return results;\n  }\n\n  /**\n   * Get all available labels\n   */\n  getLabels(): string[] {\n    return this.retrieval.getLabels();\n  }\n\n  /**\n   * Check if generator is trained\n   */\n  isTrained(): boolean {\n    return this.retrieval.hasLabel(this.getLabels()[0] || '') && this.elm.isTrained();\n  }\n}\n\n","/**\n * ExactGenerator - Perfect retrieval with pattern-based variations\n * Provides 100% realistic data by using exact training samples + pattern matching\n */\n\nimport { RetrievalGenerator } from './RetrievalGenerator';\nimport { PatternCorrector } from '../core/PatternCorrector';\nimport { LabeledSample } from '../types';\nimport { validateForLabel } from '../core/validation';\n\nexport interface ExactGeneratorConfig {\n  seed?: number;\n  usePatternMatching?: boolean;\n  maxVariations?: number;\n}\n\nexport class ExactGenerator {\n  private retrieval: RetrievalGenerator;\n  private patternCorrector: PatternCorrector;\n  private config: ExactGeneratorConfig;\n  private trainingSamples: LabeledSample[] = [];\n\n  constructor(config: ExactGeneratorConfig = {}) {\n    this.config = {\n      usePatternMatching: true,\n      maxVariations: 10,\n      ...config,\n    };\n    this.retrieval = new RetrievalGenerator(config.seed);\n    this.patternCorrector = new PatternCorrector();\n  }\n\n  /**\n   * Train the exact generator\n   */\n  train(samples: LabeledSample[]): void {\n    this.trainingSamples = samples;\n    this.retrieval.ingest(samples);\n    \n    if (this.config.usePatternMatching) {\n      this.patternCorrector.learnPatterns(samples);\n    }\n  }\n\n  /**\n   * Generate an exact sample (100% realistic)\n   */\n  generate(label: string, seed?: number): string {\n    // 1. Try exact retrieval first (100% realistic)\n    const exact = this.retrieval.sampleOne(label);\n    if (exact) {\n      return exact; // ✅ 100% realistic\n    }\n\n    // 2. If pattern matching enabled, try pattern-based generation\n    if (this.config.usePatternMatching) {\n      const pattern = this.patternCorrector.getPattern(label);\n      if (pattern && pattern.examples.length > 0) {\n        // Return a random example from the pattern\n        const randomIndex = seed !== undefined \n          ? seed % pattern.examples.length \n          : Math.floor(Math.random() * pattern.examples.length);\n        return pattern.examples[randomIndex];\n      }\n    }\n\n    throw new Error(`No samples found for label: ${label}`);\n  }\n\n  /**\n   * Generate with pattern-based variations\n   */\n  generateWithVariation(label: string, seed?: number): string {\n    // Get base sample\n    const base = this.generate(label, seed);\n    \n    if (!this.config.usePatternMatching) {\n      return base;\n    }\n\n    // Try to create variations using pattern matching\n    const pattern = this.patternCorrector.getPattern(label);\n    if (!pattern) {\n      return base;\n    }\n\n    // Simple variation: combine prefix from one example with suffix from another\n    if (pattern.examples.length >= 2) {\n      const seed1 = seed !== undefined ? seed : Date.now();\n      const seed2 = seed1 + 1000;\n      const idx1 = seed1 % pattern.examples.length;\n      const idx2 = seed2 % pattern.examples.length;\n      \n      if (idx1 !== idx2) {\n        const ex1 = pattern.examples[idx1];\n        const ex2 = pattern.examples[idx2];\n        \n        // Try combining if they're similar length\n        if (Math.abs(ex1.length - ex2.length) <= 2) {\n          const mid = Math.floor(ex1.length / 2);\n          const variation = ex1.substring(0, mid) + ex2.substring(mid);\n          \n          // Validate the variation\n          const validation = validateForLabel(label, variation);\n          if (validation.isValid) {\n            // Score the variation\n            const score = this.patternCorrector.score(variation, label);\n            if (score > 0.6) { // Only use if reasonably good\n              return validation.cleaned;\n            }\n          }\n        }\n      }\n    }\n\n    return base;\n  }\n\n  /**\n   * Generate multiple exact samples\n   */\n  generateBatch(label: string, count: number): string[] {\n    const results: string[] = [];\n    const seen = new Set<string>();\n    \n    // Try to get unique exact samples\n    for (let i = 0; i < count * 2 && results.length < count; i++) {\n      const seed = this.config.seed !== undefined \n        ? this.config.seed + i \n        : Date.now() + i;\n      \n      let generated: string;\n      if (i < count && this.config.usePatternMatching) {\n        // First half: exact matches\n        generated = this.generate(label, seed);\n      } else {\n        // Second half: try variations\n        generated = this.generateWithVariation(label, seed);\n      }\n      \n      if (generated && !seen.has(generated.toLowerCase())) {\n        results.push(generated);\n        seen.add(generated.toLowerCase());\n      }\n    }\n    \n    return results;\n  }\n\n  /**\n   * Get all available labels\n   */\n  getLabels(): string[] {\n    return this.retrieval.getLabels();\n  }\n\n  /**\n   * Check if generator is trained\n   */\n  isTrained(): boolean {\n    return this.retrieval.getLabels().length > 0;\n  }\n}\n\n","/**\n * PerfectGenerator - Best of all worlds\n * Combines exact retrieval, pattern matching, and improved ELM generation\n * Provides highest realism with good variation\n */\n\nimport { ExactGenerator } from './ExactGenerator';\nimport { HybridGenerator } from './HybridGenerator';\nimport { ELMGenerator } from './ELMGenerator';\nimport { LabeledSample } from '../types';\nimport { PatternCorrector } from '../core/PatternCorrector';\nimport { validateForLabel } from '../core/validation';\n\nexport interface PerfectGeneratorConfig {\n  maxLength: number;\n  seed?: number;\n  preferExact?: boolean; // Prefer exact matches over generated\n  usePatternMatching?: boolean;\n  useImprovedELM?: boolean; // Use classification + one-hot\n  elmHiddenUnits?: number;\n  elmActivation?: 'tanh' | 'relu' | 'leakyrelu' | 'sigmoid' | 'linear' | 'gelu';\n  elmRidgeLambda?: number;\n  noiseSize?: number;\n}\n\nexport class PerfectGenerator {\n  private exact: ExactGenerator;\n  private hybrid: HybridGenerator;\n  private elm: ELMGenerator | null = null;\n  private patternCorrector: PatternCorrector;\n  private config: PerfectGeneratorConfig;\n  private trainingSamples: LabeledSample[] = [];\n\n  constructor(config: PerfectGeneratorConfig) {\n    this.config = {\n      preferExact: true,\n      usePatternMatching: true,\n      useImprovedELM: false, // Default to false to avoid memory issues (creates duplicate ELM)\n      elmHiddenUnits: 128, // Reduced from 256 for memory efficiency\n      elmActivation: 'relu',\n      elmRidgeLambda: 0.001, // Lower regularization\n      noiseSize: 32,\n      ...config,\n    };\n\n    this.exact = new ExactGenerator({\n      seed: config.seed,\n      usePatternMatching: this.config.usePatternMatching,\n    });\n\n    this.hybrid = new HybridGenerator({\n      maxLength: config.maxLength,\n      seed: config.seed,\n      exactMode: false, // Allow some jitter for variation\n      jitterStrength: 0.02, // Very low jitter (2%)\n      useOneHot: false, // Disable one-hot to reduce memory (was: this.config.useImprovedELM)\n      useClassification: false, // Disable classification to reduce memory (was: this.config.useImprovedELM)\n      usePatternCorrection: true,\n      elmHiddenUnits: this.config.elmHiddenUnits, // Now uses reduced 128 instead of 256\n      elmActivation: this.config.elmActivation,\n      elmRidgeLambda: this.config.elmRidgeLambda,\n      noiseSize: this.config.noiseSize,\n    });\n\n    // Only create standalone ELM if explicitly requested AND useImprovedELM is true\n    // This avoids duplicate ELM training (HybridGenerator already has one)\n    if (this.config.useImprovedELM && config.useImprovedELM === true) {\n      this.elm = new ELMGenerator({\n        maxLength: config.maxLength,\n        seed: config.seed,\n        hiddenUnits: this.config.elmHiddenUnits,\n        activation: this.config.elmActivation,\n        ridgeLambda: this.config.elmRidgeLambda,\n        noiseSize: this.config.noiseSize,\n        useOneHot: false, // Disable one-hot to reduce memory\n        useClassification: false, // Disable classification to reduce memory\n        usePatternCorrection: true,\n      });\n    }\n\n    this.patternCorrector = new PatternCorrector();\n  }\n\n  /**\n   * Train the perfect generator\n   */\n  train(samples: LabeledSample[]): void {\n    this.trainingSamples = samples;\n    \n    // Train generators in order of priority (exact is fastest)\n    this.exact.train(samples);\n    \n    // Only train hybrid if we need it (lazy training)\n    // We'll train it on first use if needed\n    \n    // Learn patterns (lightweight)\n    this.patternCorrector.learnPatterns(samples);\n  }\n  \n  /**\n   * Lazy train hybrid generator\n   */\n  private ensureHybridTrained(): void {\n    if (!this.hybrid.isTrained() && this.trainingSamples.length > 0) {\n      this.hybrid.train(this.trainingSamples);\n    }\n  }\n  \n  /**\n   * Lazy train ELM generator\n   */\n  private ensureELMTrained(): void {\n    if (this.elm && !this.elm.isTrained() && this.trainingSamples.length > 0) {\n      this.elm.train(this.trainingSamples);\n    }\n  }\n\n  /**\n   * Generate with best strategy\n   */\n  generate(label: string, seed?: number): string {\n    const candidates: Array<{ value: string; score: number; source: string }> = [];\n\n    // 1. Try exact retrieval first (100% realistic)\n    try {\n      const exact = this.exact.generate(label, seed);\n      if (exact) {\n        candidates.push({ value: exact, score: 1.0, source: 'exact' });\n      }\n    } catch (error) {\n      // No exact match available\n    }\n\n    // 2. Try exact with variation (95-100% realistic)\n    try {\n      const exactVar = this.exact.generateWithVariation(label, seed);\n      if (exactVar && exactVar !== candidates[0]?.value) {\n        const score = this.patternCorrector.score(exactVar, label);\n        candidates.push({ value: exactVar, score: score * 0.95, source: 'exact-variation' });\n      }\n    } catch (error) {\n      // Skip\n    }\n\n    // 3. Try hybrid (80-90% realistic) - lazy train if needed\n    try {\n      this.ensureHybridTrained();\n      const hybrid = this.hybrid.generate(label, seed);\n      if (hybrid && !candidates.some(c => c.value === hybrid)) {\n        const score = this.patternCorrector.score(hybrid, label);\n        const validation = validateForLabel(label, hybrid);\n        const finalScore = validation.isValid ? score * 0.85 : score * 0.5;\n        candidates.push({ value: hybrid, score: finalScore, source: 'hybrid' });\n      }\n    } catch (error) {\n      // Skip\n    }\n\n    // 4. Try improved ELM if available (75-85% realistic) - lazy train if needed\n    if (this.elm) {\n      try {\n        this.ensureELMTrained();\n        const elmGen = this.elm.generate(label, seed);\n        if (elmGen && !candidates.some(c => c.value === elmGen)) {\n          const score = this.patternCorrector.score(elmGen, label);\n          const validation = validateForLabel(label, elmGen);\n          const finalScore = validation.isValid ? score * 0.8 : score * 0.4;\n          candidates.push({ value: elmGen, score: finalScore, source: 'elm' });\n        }\n      } catch (error) {\n        // Skip\n      }\n    }\n\n    // 5. Select best candidate\n    if (candidates.length === 0) {\n      throw new Error(`No samples found for label: ${label}`);\n    }\n\n    // Sort by score (highest first)\n    candidates.sort((a, b) => b.score - a.score);\n\n    // If preferExact and we have exact match, use it\n    if (this.config.preferExact) {\n      const exactCandidate = candidates.find(c => c.source === 'exact');\n      if (exactCandidate && exactCandidate.score >= 0.9) {\n        return exactCandidate.value;\n      }\n    }\n\n    // Return highest scoring candidate\n    return candidates[0].value;\n  }\n\n  /**\n   * Generate multiple samples with best strategy\n   */\n  generateBatch(label: string, count: number): string[] {\n    const results: string[] = [];\n    const seen = new Set<string>();\n    let attempts = 0;\n    const maxAttempts = count * 5;\n\n    while (results.length < count && attempts < maxAttempts) {\n      const seed = this.config.seed !== undefined \n        ? this.config.seed + attempts \n        : Date.now() + attempts;\n\n      try {\n        const generated = this.generate(label, seed);\n        \n        if (generated && generated.length > 0 && !seen.has(generated.toLowerCase())) {\n          results.push(generated);\n          seen.add(generated.toLowerCase());\n        }\n      } catch (error) {\n        // Skip errors\n      }\n\n      attempts++;\n    }\n\n    return results;\n  }\n\n  /**\n   * Get all available labels\n   */\n  getLabels(): string[] {\n    return this.exact.getLabels();\n  }\n\n  /**\n   * Check if generator is trained\n   */\n  isTrained(): boolean {\n    // At minimum, exact generator should be trained\n    return this.exact.isTrained();\n  }\n}\n\n","// src/base64url.ts\nfunction toUint8ArrayFromString(str) {\n    const encoder = new TextEncoder();\n    return encoder.encode(str);\n}\nfunction fromUint8ArrayToString(bytes) {\n    const decoder = new TextDecoder();\n    return decoder.decode(bytes);\n}\nexport function base64urlEncode(bytes) {\n    let base64;\n    if (typeof btoa !== \"undefined\") {\n        let binary = \"\";\n        for (let i = 0; i < bytes.length; i++) {\n            binary += String.fromCharCode(bytes[i]);\n        }\n        base64 = btoa(binary);\n    }\n    else {\n        // Node - copy bytes to avoid buffer type issues\n        const Buffer = require(\"buffer\").Buffer;\n        const byteArray = new Uint8Array(bytes.length);\n        for (let i = 0; i < bytes.length; i++) {\n            byteArray[i] = bytes[i];\n        }\n        base64 = Buffer.from(byteArray).toString(\"base64\");\n    }\n    return base64.replace(/=/g, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\nexport function base64urlDecode(str) {\n    let base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    while (base64.length % 4 !== 0) {\n        base64 += \"=\";\n    }\n    if (typeof atob !== \"undefined\") {\n        const binary = atob(base64);\n        const bytes = new Uint8Array(binary.length);\n        for (let i = 0; i < binary.length; i++) {\n            bytes[i] = binary.charCodeAt(i);\n        }\n        return bytes;\n    }\n    else {\n        // Node.js environment - always create a new ArrayBuffer\n        const Buffer = require(\"buffer\").Buffer;\n        const buf = Buffer.from(base64, \"base64\");\n        // Copy to a new ArrayBuffer to avoid SharedArrayBuffer/type issues\n        const result = new Uint8Array(buf.length);\n        for (let i = 0; i < buf.length; i++) {\n            result[i] = buf[i];\n        }\n        return result;\n    }\n}\nexport function base64urlEncodeJson(obj) {\n    const json = JSON.stringify(obj);\n    return base64urlEncode(toUint8ArrayFromString(json));\n}\nexport function base64urlDecodeJson(str) {\n    const bytes = base64urlDecode(str);\n    const json = fromUint8ArrayToString(bytes);\n    return JSON.parse(json);\n}\n//# sourceMappingURL=base64url.js.map","// src/joseSignature.ts\n// Convert JOSE-style ECDSA signature (r||s) to DER encoding expected by WebCrypto verify\nexport function joseToDer(joseSig) {\n    const len = joseSig.length;\n    if (len % 2 !== 0)\n        throw new Error(\"Invalid JOSE signature length\");\n    const size = len / 2;\n    // Copy slices to new ArrayBuffers to avoid SharedArrayBuffer issues\n    const rSlice = new Uint8Array(size);\n    const sSlice = new Uint8Array(size);\n    for (let i = 0; i < size; i++) {\n        rSlice[i] = joseSig[i];\n        sSlice[i] = joseSig[i + size];\n    }\n    let r = trimLeadingZeros(rSlice);\n    let s = trimLeadingZeros(sSlice);\n    // If high bit is set, prepend 0x00 per DER INTEGER rule\n    const rHead = (r[0] & 0x80) !== 0;\n    const sHead = (s[0] & 0x80) !== 0;\n    const rLen = r.length + (rHead ? 1 : 0);\n    const sLen = s.length + (sHead ? 1 : 0);\n    const totalLen = 2 + rLen + 2 + sLen;\n    const der = new Uint8Array(2 + totalLen);\n    let offset = 0;\n    der[offset++] = 0x30; // SEQUENCE\n    der[offset++] = totalLen; // length\n    der[offset++] = 0x02; // INTEGER\n    der[offset++] = rLen; // length of r\n    if (rHead)\n        der[offset++] = 0x00;\n    der.set(r, offset);\n    offset += r.length;\n    der[offset++] = 0x02; // INTEGER\n    der[offset++] = sLen; // length of s\n    if (sHead)\n        der[offset++] = 0x00;\n    der.set(s, offset);\n    offset += s.length;\n    return der;\n}\nfunction trimLeadingZeros(bytes) {\n    let i = 0;\n    while (i < bytes.length - 1 && bytes[i] === 0)\n        i++;\n    // Copy to new ArrayBuffer to avoid SharedArrayBuffer issues\n    const result = new Uint8Array(bytes.length - i);\n    for (let j = 0; j < result.length; j++) {\n        result[j] = bytes[i + j];\n    }\n    return result;\n}\n//# sourceMappingURL=joseSignature.js.map","// src/time.ts\nexport function nowEpochSeconds() {\n    return Math.floor(Date.now() / 1000);\n}\n//# sourceMappingURL=time.js.map","// src/jwksCache.ts\nimport { base64urlDecode } from \"./base64url\";\nconst cache = {};\nexport async function fetchJwks(jwksUrl, maxAgeSeconds = 300) {\n    const now = Math.floor(Date.now() / 1000);\n    const entry = cache[jwksUrl];\n    if (entry && now - entry.fetchedAt < maxAgeSeconds) {\n        return entry.jwks;\n    }\n    const res = await fetch(jwksUrl, { method: \"GET\", cache: \"no-store\" });\n    if (!res.ok) {\n        throw new Error(`Failed to fetch JWKS: ${res.status}`);\n    }\n    const json = await res.json();\n    const jwks = json;\n    cache[jwksUrl] = { jwks, fetchedAt: now };\n    return jwks;\n}\nexport function findJwkForKid(jwks, kid) {\n    return jwks.keys.find(k => k.kid === kid);\n}\nexport function jwkToCryptoKeyImportParams(jwk) {\n    if (jwk.kty !== \"EC\" || jwk.crv !== \"P-256\" || !jwk.x || !jwk.y) {\n        throw new Error(\"Unsupported JWK\");\n    }\n    return { name: \"ECDSA\", namedCurve: \"P-256\" };\n}\n// Decode x/y from base64url to raw bytes\nexport function jwkToRawPublicKey(jwk) {\n    if (!jwk.x || !jwk.y)\n        throw new Error(\"JWK missing x/y\");\n    const x = base64urlDecode(jwk.x);\n    const y = base64urlDecode(jwk.y);\n    return { x, y };\n}\n//# sourceMappingURL=jwksCache.js.map","// src/verifyLktClient.ts\nimport { base64urlDecode, base64urlDecodeJson } from \"./base64url\";\nimport { joseToDer } from \"./joseSignature\";\nimport { nowEpochSeconds } from \"./time\";\nimport { fetchJwks, findJwkForKid } from \"./jwksCache\";\nfunction getCrypto() {\n    // Browser: globalThis.crypto\n    // Node 20+: globalThis.crypto or require(\"crypto\").webcrypto\n    if (typeof crypto !== \"undefined\" && crypto.subtle)\n        return crypto;\n    // @ts-ignore\n    const nodeCrypto = require(\"crypto\").webcrypto;\n    if (!nodeCrypto || !nodeCrypto.subtle)\n        throw new Error(\"WebCrypto not available\");\n    return nodeCrypto;\n}\nexport async function verifyLktClient(token, opts) {\n    if (!token) {\n        return { status: \"missing\", reason: \"No token provided\" };\n    }\n    const parts = token.split(\".\");\n    if (parts.length !== 3) {\n        return { status: \"invalid\", reason: \"Malformed token\" };\n    }\n    const [headerSegment, payloadSegment, signatureSegment] = parts;\n    const signingInput = `${headerSegment}.${payloadSegment}`;\n    try {\n        const header = base64urlDecodeJson(headerSegment);\n        const payload = base64urlDecodeJson(payloadSegment);\n        const signatureJose = base64urlDecode(signatureSegment);\n        const signatureDer = joseToDer(signatureJose);\n        // Claim checks\n        if (payload.iss !== opts.expectedIss) {\n            return { status: \"invalid\", reason: \"Bad issuer\", header, payload };\n        }\n        if (payload.aud !== opts.expectedAud) {\n            return { status: \"invalid\", reason: \"Bad audience\", header, payload };\n        }\n        const now = nowEpochSeconds();\n        if (typeof payload.exp === \"number\" && now > payload.exp) {\n            return { status: \"expired\", reason: \"Token expired\", header, payload };\n        }\n        const jwks = await fetchJwks(opts.jwksUrl, opts.jwksMaxAgeSeconds ?? 300);\n        const jwk = header.kid ? findJwkForKid(jwks, header.kid) : undefined;\n        if (!jwk) {\n            return { status: \"invalid\", reason: \"Key not found for kid\", header, payload };\n        }\n        const crypto = getCrypto();\n        const key = await crypto.subtle.importKey(\"jwk\", jwk, { name: \"ECDSA\", namedCurve: \"P-256\" }, false, [\"verify\"]);\n        const encoder = new TextEncoder();\n        const data = encoder.encode(signingInput);\n        // Ensure signatureDer is a proper ArrayBuffer view (copy to avoid SharedArrayBuffer issues)\n        const signatureArray = new Uint8Array(signatureDer.length);\n        signatureArray.set(signatureDer);\n        const ok = await crypto.subtle.verify({ name: \"ECDSA\", hash: \"SHA-256\" }, key, signatureArray, data);\n        if (!ok) {\n            return { status: \"invalid\", reason: \"Signature invalid\", header, payload };\n        }\n        return {\n            status: \"valid\",\n            header,\n            payload,\n            lastCheckedAt: now\n        };\n    }\n    catch (err) {\n        return { status: \"invalid\", reason: err?.message || \"Verification error\" };\n    }\n}\n//# sourceMappingURL=verifyLktClient.js.map","import { verifyLktClient } from \"./verifyLktClient\";\nexport class LicenseRuntime {\n    constructor(config) {\n        this.token = null;\n        this.state = { status: \"missing\" };\n        this.listeners = [];\n        this.verifying = false;\n        this.config = { ...config, mode: config.mode ?? \"strict\" };\n    }\n    getState() {\n        return this.state;\n    }\n    onChange(listener) {\n        this.listeners.push(listener);\n        // fire immediately with current state\n        listener(this.state);\n        return () => {\n            this.listeners = this.listeners.filter(l => l !== listener);\n        };\n    }\n    notify() {\n        for (const l of this.listeners) {\n            l(this.state);\n        }\n    }\n    async setToken(token) {\n        this.token = token;\n        await this.verifyNow();\n    }\n    async verifyNow() {\n        if (this.verifying)\n            return;\n        this.verifying = true;\n        try {\n            if (!this.token) {\n                this.state = { status: \"missing\", reason: \"No token set\" };\n                this.notify();\n                return;\n            }\n            const res = await verifyLktClient(this.token, {\n                jwksUrl: this.config.jwksUrl,\n                expectedIss: this.config.expectedIss,\n                expectedAud: this.config.expectedAud,\n                jwksMaxAgeSeconds: this.config.jwksMaxAgeSeconds\n            });\n            // Eval mode: downgrade \"invalid\" or \"missing\" to \"eval\" in non-production\n            if (this.config.mode === \"eval\" && (res.status === \"missing\" || res.status === \"invalid\")) {\n                this.state = {\n                    status: \"eval\",\n                    reason: res.reason || \"Eval mode fallback\",\n                    payload: res.payload,\n                    header: res.header,\n                    lastCheckedAt: res.lastCheckedAt\n                };\n            }\n            else {\n                this.state = res;\n            }\n            this.notify();\n        }\n        finally {\n            this.verifying = false;\n        }\n    }\n    hasFeature(feature) {\n        if (this.state.status !== \"valid\" && this.state.status !== \"eval\")\n            return false;\n        const features = this.state.payload?.features || [];\n        if (features.includes(\"*\"))\n            return true;\n        return features.includes(feature);\n    }\n    requireFeature(feature) {\n        if (this.state.status === \"valid\") {\n            if (!this.hasFeature(feature)) {\n                throw new Error(`Feature \"${feature}\" not enabled for current license plan.`);\n            }\n            return;\n        }\n        if (this.state.status === \"eval\") {\n            console.warn(`Feature \"${feature}\" used in eval mode.`, this.state.reason);\n            return;\n        }\n        // Strict mode: throw on anything else\n        if (this.config.mode === \"strict\") {\n            throw new Error(`License is not valid (status=${this.state.status}). Cannot use feature \"${feature}\".`);\n        }\n        else {\n            console.warn(`License not valid (status=${this.state.status}), but eval mode allows temporary use.`);\n        }\n    }\n}\n//# sourceMappingURL=runtime.js.map","// src/index.ts\nimport { LicenseRuntime } from \"./runtime\";\nimport { verifyLktClient } from \"./verifyLktClient\";\nimport { fetchJwks, findJwkForKid } from \"./jwksCache\";\nexport { LicenseRuntime };\nexport { verifyLktClient };\nexport { fetchJwks, findJwkForKid };\nlet singleton = null;\nexport function initLicenseRuntime(config) {\n    singleton = new LicenseRuntime(config);\n    return singleton;\n}\nexport function getLicenseRuntime() {\n    if (!singleton) {\n        throw new Error(\"LicenseRuntime not initialized. Call initLicenseRuntime(...) first.\");\n    }\n    return singleton;\n}\nexport function setLicenseToken(token) {\n    return getLicenseRuntime().setToken(token);\n}\nexport function getLicenseState() {\n    return getLicenseRuntime().getState();\n}\nexport function requireFeature(feature) {\n    return getLicenseRuntime().requireFeature(feature);\n}\nexport function hasFeature(feature) {\n    return getLicenseRuntime().hasFeature(feature);\n}\n//# sourceMappingURL=index.js.map","/**\n * License Runtime Integration\n * Initializes and manages AsterMind license verification\n */\n\nimport { \n  initLicenseRuntime, \n  setLicenseToken, \n  requireFeature, \n  hasFeature, \n  getLicenseState \n} from '@astermindai/license-runtime';\n\nlet isInitialized = false;\n\n/**\n * Initialize the license runtime\n * Should be called once at application startup\n */\nexport function initializeLicense(): void {\n  if (isInitialized) {\n    return;\n  }\n\n  const mode = process.env.NODE_ENV === 'production' ? 'strict' : 'eval';\n  \n  initLicenseRuntime({\n    jwksUrl: 'https://license.astermind.ai/.well-known/astermind-license-keys.json',\n    expectedIss: 'https://license.astermind.ai',\n    expectedAud: 'astermind-synth',\n    mode,\n  });\n\n  // Set license token from environment variable if provided\n  const licenseToken = process.env.ASTERMIND_LICENSE_TOKEN;\n  if (licenseToken) {\n    setLicenseToken(licenseToken).catch((error) => {\n      console.warn('Failed to set license token:', error.message);\n    });\n  }\n\n  isInitialized = true;\n}\n\n/**\n * Check if the astermind-synth feature is available\n * @returns true if feature is available, false otherwise\n */\nexport function checkLicense(): boolean {\n  if (!isInitialized) {\n    initializeLicense();\n  }\n  return hasFeature('astermind-synth');\n}\n\n/**\n * Require the astermind-synth feature\n * Throws an error in strict mode if not available\n * Logs a warning in eval mode if not available\n * @throws Error if feature is not available in strict mode\n */\nexport function requireLicense(): void {\n  if (!isInitialized) {\n    initializeLicense();\n  }\n  requireFeature('astermind-synth');\n}\n\n/**\n * Get current license state\n * @returns License state object\n */\nexport function getLicenseStatus() {\n  if (!isInitialized) {\n    initializeLicense();\n  }\n  return getLicenseState();\n}\n\n/**\n * Set license token programmatically\n * @param token License token string\n */\nexport async function setLicenseTokenFromString(token: string): Promise<void> {\n  if (!isInitialized) {\n    initializeLicense();\n  }\n  await setLicenseToken(token);\n}\n\n","/**\n * OmegaSynth - Main class\n * Unified interface for synthetic data generation\n */\n\nimport { OmegaSynthConfig, LabeledSample, SyntheticMode } from './types';\nimport { RetrievalGenerator } from './generators/RetrievalGenerator';\nimport { ELMGenerator } from './generators/ELMGenerator';\nimport { HybridGenerator } from './generators/HybridGenerator';\nimport { ExactGenerator } from './generators/ExactGenerator';\nimport { PerfectGenerator } from './generators/PerfectGenerator';\nimport { requireLicense } from './core/license';\n\nexport class OmegaSynth {\n  private config: OmegaSynthConfig;\n  private generator: RetrievalGenerator | ELMGenerator | HybridGenerator | ExactGenerator | PerfectGenerator | null = null;\n  private seed?: number;\n\n  constructor(config: OmegaSynthConfig) {\n    // Require license before initializing\n    requireLicense();\n\n    this.config = {\n      maxLength: 32,\n      ...config,\n    };\n    this.seed = config.seed;\n\n    // Initialize generator based on mode\n    this.initializeGenerator();\n  }\n\n  private initializeGenerator(): void {\n    const commonConfig = {\n      maxLength: this.config.maxLength || 32,\n      seed: this.seed,\n    };\n\n    switch (this.config.mode) {\n      case 'retrieval':\n        this.generator = new RetrievalGenerator(this.seed);\n        break;\n      case 'elm':\n        this.generator = new ELMGenerator({\n          ...commonConfig,\n          hiddenUnits: 128,\n          activation: 'relu',\n          ridgeLambda: 0.01,\n          noiseSize: 32,\n          useOneHot: this.config.useOneHot ?? false, // Default to false for memory efficiency\n          useClassification: this.config.useClassification ?? false,\n          usePatternCorrection: this.config.usePatternCorrection ?? true,\n        });\n        break;\n      case 'hybrid':\n        this.generator = new HybridGenerator({\n          ...commonConfig,\n          elmHiddenUnits: 128,\n          elmActivation: 'relu',\n          elmRidgeLambda: 0.01,\n          noiseSize: 32,\n          jitterStrength: this.config.exactMode ? 0 : 0.05,\n          exactMode: this.config.exactMode ?? false,\n          useOneHot: this.config.useOneHot ?? false, // Default to false for memory efficiency\n          useClassification: this.config.useClassification ?? false,\n          usePatternCorrection: this.config.usePatternCorrection ?? true,\n        });\n        break;\n      case 'exact':\n        this.generator = new ExactGenerator({\n          seed: this.seed,\n          usePatternMatching: true,\n        });\n        break;\n      case 'perfect':\n        this.generator = new PerfectGenerator({\n          ...commonConfig,\n          preferExact: true,\n          usePatternMatching: true,\n          useImprovedELM: true,\n          elmHiddenUnits: 256,\n          elmActivation: 'relu',\n          elmRidgeLambda: 0.001,\n          noiseSize: 32,\n        });\n        break;\n      default:\n        throw new Error(`Unknown mode: ${this.config.mode}`);\n    }\n  }\n\n  /**\n   * Train the generator on a dataset\n   * @param dataset Array of labeled samples\n   */\n  async train(dataset: LabeledSample[]): Promise<void> {\n    if (!this.generator) {\n      throw new Error('Generator not initialized');\n    }\n\n    if (this.config.mode === 'retrieval') {\n      (this.generator as RetrievalGenerator).ingest(dataset);\n    } else if (this.config.mode === 'elm') {\n      (this.generator as ELMGenerator).train(dataset);\n    } else if (this.config.mode === 'hybrid') {\n      (this.generator as HybridGenerator).train(dataset);\n    } else if (this.config.mode === 'exact') {\n      (this.generator as ExactGenerator).train(dataset);\n    } else if (this.config.mode === 'perfect') {\n      (this.generator as PerfectGenerator).train(dataset);\n    }\n  }\n\n  /**\n   * Generate a synthetic value for a given label\n   * @param label Label to generate for\n   * @param seed Optional seed for deterministic generation\n   */\n  async generate(label: string, seed?: number): Promise<string> {\n    if (!this.generator) {\n      throw new Error('Generator not initialized. Call train() first.');\n    }\n\n    if (this.config.mode === 'retrieval') {\n      const result = (this.generator as RetrievalGenerator).sampleOne(label);\n      if (!result) {\n        throw new Error(`No samples found for label: ${label}`);\n      }\n      return result;\n    } else if (this.config.mode === 'elm') {\n      return (this.generator as ELMGenerator).generate(label, seed);\n    } else if (this.config.mode === 'hybrid') {\n      return (this.generator as HybridGenerator).generate(label, seed);\n    } else if (this.config.mode === 'exact') {\n      return (this.generator as ExactGenerator).generate(label, seed);\n    } else if (this.config.mode === 'perfect') {\n      return (this.generator as PerfectGenerator).generate(label, seed);\n    }\n\n    throw new Error(`Unknown mode: ${this.config.mode}`);\n  }\n\n  /**\n   * Generate multiple synthetic values for a label\n   * @param label Label to generate for\n   * @param count Number of samples to generate\n   */\n  async generateBatch(label: string, count: number): Promise<string[]> {\n    if (!this.generator) {\n      throw new Error('Generator not initialized. Call train() first.');\n    }\n\n    if (this.config.mode === 'retrieval') {\n      return (this.generator as RetrievalGenerator).sample(label, count);\n    } else if (this.config.mode === 'elm') {\n      return (this.generator as ELMGenerator).generateBatch(label, count);\n    } else if (this.config.mode === 'hybrid') {\n      return (this.generator as HybridGenerator).generateBatch(label, count);\n    } else if (this.config.mode === 'exact') {\n      return (this.generator as ExactGenerator).generateBatch(label, count);\n    } else if (this.config.mode === 'perfect') {\n      return (this.generator as PerfectGenerator).generateBatch(label, count);\n    }\n\n    throw new Error(`Unknown mode: ${this.config.mode}`);\n  }\n\n  /**\n   * Get all available labels\n   */\n  getLabels(): string[] {\n    if (!this.generator) {\n      return [];\n    }\n\n    if (this.config.mode === 'retrieval') {\n      return (this.generator as RetrievalGenerator).getLabels();\n    } else if (this.config.mode === 'elm') {\n      return (this.generator as ELMGenerator).getLabels();\n    } else if (this.config.mode === 'hybrid') {\n      return (this.generator as HybridGenerator).getLabels();\n    } else if (this.config.mode === 'exact') {\n      return (this.generator as ExactGenerator).getLabels();\n    } else if (this.config.mode === 'perfect') {\n      return (this.generator as PerfectGenerator).getLabels();\n    }\n\n    return [];\n  }\n\n  /**\n   * Check if the generator is trained\n   */\n  isTrained(): boolean {\n    if (!this.generator) {\n      return false;\n    }\n\n    if (this.config.mode === 'retrieval') {\n      const labels = (this.generator as RetrievalGenerator).getLabels();\n      return labels.length > 0;\n    } else if (this.config.mode === 'elm') {\n      return (this.generator as ELMGenerator).isTrained();\n    } else if (this.config.mode === 'hybrid') {\n      return (this.generator as HybridGenerator).isTrained();\n    } else if (this.config.mode === 'exact') {\n      return (this.generator as ExactGenerator).isTrained();\n    } else if (this.config.mode === 'perfect') {\n      return (this.generator as PerfectGenerator).isTrained();\n    }\n\n    return false;\n  }\n\n  /**\n   * Set seed for deterministic generation\n   */\n  setSeed(seed: number): void {\n    this.seed = seed;\n    // Reinitialize generator with new seed\n    this.initializeGenerator();\n  }\n}\n\n","/**\n * Load and combine training data from multiple JSON files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { LabeledSample } from '../types';\n\nexport interface TrainingDataFile {\n  version: string;\n  labels: Record<string, string[]>;\n}\n\n/**\n * Load a single training data file\n */\nexport function loadTrainingDataFile(filepath: string): TrainingDataFile {\n  try {\n    const content = fs.readFileSync(filepath, 'utf-8');\n    return JSON.parse(content) as TrainingDataFile;\n  } catch (error) {\n    throw new Error(`Failed to load training data file ${filepath}: ${error}`);\n  }\n}\n\n/**\n * Combine multiple training data files into a single dataset\n */\nexport function combineTrainingData(\n  files: TrainingDataFile[]\n): LabeledSample[] {\n  const combined: Map<string, Set<string>> = new Map();\n\n  // Combine all labels from all files\n  for (const file of files) {\n    for (const [label, values] of Object.entries(file.labels)) {\n      if (!combined.has(label)) {\n        combined.set(label, new Set());\n      }\n      const labelSet = combined.get(label)!;\n      for (const value of values) {\n        labelSet.add(value);\n      }\n    }\n  }\n\n  // Convert to LabeledSample array\n  const samples: LabeledSample[] = [];\n  for (const [label, values] of combined.entries()) {\n    for (const value of values) {\n      samples.push({ label, value });\n    }\n  }\n\n  return samples;\n}\n\n/**\n * Load all training data files from a directory\n */\nexport function loadAllTrainingData(\n  directory: string,\n  excludePatterns: string[] = ['test', 'val', 'default']\n): LabeledSample[] {\n  const files: TrainingDataFile[] = [];\n  const entries = fs.readdirSync(directory);\n\n  for (const entry of entries) {\n    // Skip files that match exclude patterns\n    if (excludePatterns.some(pattern => entry.includes(pattern))) {\n      continue;\n    }\n\n    if (entry.endsWith('.json')) {\n      const filepath = path.join(directory, entry);\n      try {\n        const data = loadTrainingDataFile(filepath);\n        files.push(data);\n        console.log(`Loaded training data from: ${entry}`);\n      } catch (error) {\n        console.error(`Error loading ${entry}:`, error);\n      }\n    }\n  }\n\n  const combined = combineTrainingData(files);\n  console.log(\n    `Combined ${files.length} files into ${combined.length} training samples`\n  );\n  console.log(\n    `Labels: ${Array.from(new Set(combined.map(s => s.label))).join(', ')}`\n  );\n\n  return combined;\n}\n\n","/**\n * Train OmegaSynth model on combined training data\n */\n\nimport { OmegaSynth } from '../OmegaSynth';\nimport { LabeledSample } from '../types';\nimport { loadTrainingDataFile, combineTrainingData } from './loadTrainingData';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface TrainingConfig {\n  mode: 'retrieval' | 'elm' | 'hybrid';\n  maxLength?: number;\n  seed?: number;\n  trainingFiles: string[];\n}\n\nexport interface TrainedModel {\n  synth: OmegaSynth;\n  config: TrainingConfig;\n  trainingStats: {\n    totalSamples: number;\n    labels: string[];\n    samplesPerLabel: Record<string, number>;\n  };\n  elmModelJSON?: string; // Serialized ELM model (if using elm/hybrid mode)\n  trainingSamples: LabeledSample[]; // Full training data (for saving training_data.json)\n}\n\n/**\n * Train a model on the specified training files\n */\nexport async function trainModel(\n  config: TrainingConfig\n): Promise<TrainedModel> {\n  console.log('Starting model training...');\n  console.log(`Mode: ${config.mode}`);\n  console.log(`Training files: ${config.trainingFiles.length}`);\n\n  // Load all training files\n  const trainingDataFiles = config.trainingFiles.map(file =>\n    loadTrainingDataFile(file)\n  );\n\n  // Combine into single dataset\n  const trainingSamples = combineTrainingData(trainingDataFiles);\n\n  // Calculate statistics\n  const labels = Array.from(new Set(trainingSamples.map(s => s.label)));\n  const samplesPerLabel: Record<string, number> = {};\n  for (const label of labels) {\n    samplesPerLabel[label] = trainingSamples.filter(\n      s => s.label === label\n    ).length;\n  }\n\n  console.log(`Total training samples: ${trainingSamples.length}`);\n  console.log(`Labels: ${labels.length}`);\n  for (const [label, count] of Object.entries(samplesPerLabel)) {\n    console.log(`  ${label}: ${count} samples`);\n  }\n\n  // Create and train model\n  const synth = new OmegaSynth({\n    mode: config.mode,\n    maxLength: config.maxLength || 50,\n    seed: config.seed,\n  });\n\n  console.log('Training model...');\n  await synth.train(trainingSamples);\n  console.log('Training complete!');\n\n  // Extract ELM model JSON if using elm or hybrid mode\n  let elmModelJSON: string | undefined;\n  if (config.mode === 'elm' || config.mode === 'hybrid') {\n    try {\n      // Access the internal generator to get ELM model\n      const generator = (synth as any).generator;\n      if (generator) {\n        // For hybrid mode, get ELM from the ELMGenerator\n        let elmInstance: any = null;\n        if (config.mode === 'hybrid' && generator.elm) {\n          elmInstance = generator.elm.elm; // HybridGenerator -> ELMGenerator -> elm\n        } else if (config.mode === 'elm' && generator.elm) {\n          elmInstance = generator.elm; // ELMGenerator -> elm\n        }\n        \n        if (elmInstance) {\n          // ELM stores serialized model in savedModelJSON after training\n          if (elmInstance.savedModelJSON) {\n            elmModelJSON = elmInstance.savedModelJSON;\n          } else if (elmInstance.model) {\n            // Manually serialize: get config and model weights\n            const serialized = {\n              config: elmInstance.config,\n              W: elmInstance.model.W,\n              b: elmInstance.model.b,\n              B: elmInstance.model.beta,\n              categories: elmInstance.categories || [],\n            };\n            elmModelJSON = JSON.stringify(serialized);\n          }\n          if (elmModelJSON) {\n            console.log('✅ ELM model serialized for saving');\n          }\n        }\n      }\n    } catch (error) {\n      console.warn('Could not serialize ELM model:', error);\n    }\n  }\n\n  return {\n    synth,\n    config,\n    trainingStats: {\n      totalSamples: trainingSamples.length,\n      labels,\n      samplesPerLabel,\n    },\n    elmModelJSON,\n    trainingSamples,\n  };\n}\n\n/**\n * Save trained model to file\n */\nexport async function saveModel(\n  model: TrainedModel,\n  outputDir: string\n): Promise<string> {\n  const fs = await import('fs');\n  const path = await import('path');\n\n  if (!fs.existsSync(outputDir)) {\n    fs.mkdirSync(outputDir, { recursive: true });\n  }\n\n  // Save model configuration and stats\n  const modelData = {\n    config: model.config,\n    trainingStats: model.trainingStats,\n    timestamp: new Date().toISOString(),\n  };\n\n  const modelPath = path.join(outputDir, 'model.json');\n  fs.writeFileSync(modelPath, JSON.stringify(modelData, null, 2));\n\n  console.log(`Model saved to: ${modelPath}`);\n  return modelPath;\n}\n\n","/**\n * Metrics collection and reporting for OmegaSynth\n */\n\nimport { LabeledSample } from '../types';\n\nexport interface GenerationMetrics {\n  label: string;\n  totalSamples: number;\n  uniqueGenerated: number;\n  diversity: number; // unique / total\n  averageLength: number;\n  minLength: number;\n  maxLength: number;\n  validFormat: number; // count of valid format samples\n  validFormatRate: number; // validFormat / total\n}\n\nexport interface ModelMetrics {\n  overall: {\n    totalLabels: number;\n    totalTestSamples: number;\n    averageDiversity: number;\n    averageValidFormatRate: number;\n  };\n  perLabel: GenerationMetrics[];\n  timestamp: string;\n  modelVersion: string;\n  mode: string;\n}\n\nexport class MetricsCollector {\n  /**\n   * Evaluate generated samples against test/validation data\n   */\n  static evaluate(\n    generated: string[],\n    expected: string[],\n    label: string\n  ): GenerationMetrics {\n    const totalSamples = generated.length;\n    const uniqueGenerated = new Set(generated).size;\n    const diversity = totalSamples > 0 ? uniqueGenerated / totalSamples : 0;\n\n    const lengths = generated.map(s => s.length);\n    const averageLength =\n      lengths.length > 0\n        ? lengths.reduce((a, b) => a + b, 0) / lengths.length\n        : 0;\n    const minLength = lengths.length > 0 ? Math.min(...lengths) : 0;\n    const maxLength = lengths.length > 0 ? Math.max(...lengths) : 0;\n\n    // Basic format validation (non-empty, reasonable length)\n    const validFormat = generated.filter(\n      s => s.length > 0 && s.length <= 200\n    ).length;\n    const validFormatRate =\n      totalSamples > 0 ? validFormat / totalSamples : 0;\n\n    return {\n      label,\n      totalSamples,\n      uniqueGenerated,\n      diversity,\n      averageLength,\n      minLength,\n      maxLength,\n      validFormat,\n      validFormatRate,\n    };\n  }\n\n  /**\n   * Collect metrics for all labels\n   */\n  static collectMetrics(\n    generatedByLabel: Record<string, string[]>,\n    expectedByLabel: Record<string, string[]>\n  ): ModelMetrics {\n    const labels = Object.keys(generatedByLabel);\n    const perLabel: GenerationMetrics[] = [];\n\n    let totalTestSamples = 0;\n    let totalDiversity = 0;\n    let totalValidFormatRate = 0;\n\n    for (const label of labels) {\n      const generated = generatedByLabel[label] || [];\n      const expected = expectedByLabel[label] || [];\n      const metrics = this.evaluate(generated, expected, label);\n\n      perLabel.push(metrics);\n      totalTestSamples += metrics.totalSamples;\n      totalDiversity += metrics.diversity;\n      totalValidFormatRate += metrics.validFormatRate;\n    }\n\n    return {\n      overall: {\n        totalLabels: labels.length,\n        totalTestSamples,\n        averageDiversity:\n          labels.length > 0 ? totalDiversity / labels.length : 0,\n        averageValidFormatRate:\n          labels.length > 0 ? totalValidFormatRate / labels.length : 0,\n      },\n      perLabel,\n      timestamp: new Date().toISOString(),\n      modelVersion: '2.0.0',\n      mode: 'hybrid',\n    };\n  }\n\n  /**\n   * Generate a text report from metrics\n   */\n  static generateReport(metrics: ModelMetrics): string {\n    let report = `# OmegaSynth Model Evaluation Report\\n\\n`;\n    report += `**Model Version:** ${metrics.modelVersion}\\n`;\n    report += `**Mode:** ${metrics.mode}\\n`;\n    report += `**Timestamp:** ${metrics.timestamp}\\n\\n`;\n\n    report += `## Overall Metrics\\n\\n`;\n    report += `- Total Labels: ${metrics.overall.totalLabels}\\n`;\n    report += `- Total Test Samples: ${metrics.overall.totalTestSamples}\\n`;\n    report += `- Average Diversity: ${(\n      metrics.overall.averageDiversity * 100\n    ).toFixed(2)}%\\n`;\n    report += `- Average Valid Format Rate: ${(\n      metrics.overall.averageValidFormatRate * 100\n    ).toFixed(2)}%\\n\\n`;\n\n    report += `## Per-Label Metrics\\n\\n`;\n    report += `| Label | Samples | Unique | Diversity | Avg Length | Valid Rate |\\n`;\n    report += `|-------|---------|--------|-----------|------------|------------|\\n`;\n\n    for (const labelMetrics of metrics.perLabel) {\n      report += `| ${labelMetrics.label} | ${labelMetrics.totalSamples} | ${labelMetrics.uniqueGenerated} | ${(labelMetrics.diversity * 100).toFixed(2)}% | ${labelMetrics.averageLength.toFixed(1)} | ${(labelMetrics.validFormatRate * 100).toFixed(2)}% |\\n`;\n    }\n\n    return report;\n  }\n\n  /**\n   * Save metrics to JSON file\n   */\n  static async saveMetrics(\n    metrics: ModelMetrics,\n    filepath: string\n  ): Promise<void> {\n    const fs = await import('fs');\n    const path = await import('path');\n    const dir = path.dirname(filepath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    fs.writeFileSync(filepath, JSON.stringify(metrics, null, 2));\n  }\n\n  /**\n   * Save report to markdown file\n   */\n  static async saveReport(\n    metrics: ModelMetrics,\n    filepath: string\n  ): Promise<void> {\n    const fs = await import('fs');\n    const path = await import('path');\n    const dir = path.dirname(filepath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    const report = this.generateReport(metrics);\n    fs.writeFileSync(filepath, report);\n  }\n}\n\n\n","/**\n * Test OmegaSynth model on test dataset\n */\n\nimport { OmegaSynth } from '../OmegaSynth';\nimport { LabeledSample } from '../types';\nimport { loadTrainingDataFile, combineTrainingData } from './loadTrainingData';\nimport { MetricsCollector, ModelMetrics } from '../evaluation/Metrics';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface TestConfig {\n  model: OmegaSynth;\n  testFile: string;\n  samplesPerLabel?: number; // How many samples to generate per label for testing\n}\n\nexport interface TestResult {\n  metrics: ModelMetrics;\n  passed: boolean;\n  threshold?: {\n    minDiversity: number;\n    minValidFormatRate: number;\n  };\n}\n\n/**\n * Test the model on test dataset\n */\nexport async function testModel(\n  config: TestConfig\n): Promise<TestResult> {\n  console.log('Starting model testing...');\n  console.log(`Test file: ${config.testFile}`);\n\n  // Load test data\n  const testData = loadTrainingDataFile(config.testFile);\n  const testSamples = combineTrainingData([testData]);\n\n  // Group test samples by label\n  const expectedByLabel: Record<string, string[]> = {};\n  for (const sample of testSamples) {\n    if (!expectedByLabel[sample.label]) {\n      expectedByLabel[sample.label] = [];\n    }\n    expectedByLabel[sample.label].push(sample.value);\n  }\n\n  // Generate samples for each label\n  const samplesPerLabel = config.samplesPerLabel || 10;\n  const generatedByLabel: Record<string, string[]> = {};\n\n  console.log(`Generating ${samplesPerLabel} samples per label...`);\n  for (const label of Object.keys(expectedByLabel)) {\n    try {\n      const generated = await config.model.generateBatch(\n        label,\n        samplesPerLabel\n      );\n      generatedByLabel[label] = generated;\n      console.log(`  ${label}: ${generated.length} samples generated`);\n    } catch (error) {\n      console.error(`  Error generating for ${label}:`, error);\n      generatedByLabel[label] = [];\n    }\n  }\n\n  // Collect metrics\n  const metrics = MetricsCollector.collectMetrics(\n    generatedByLabel,\n    expectedByLabel\n  );\n\n  // Determine if test passed\n  const threshold = {\n    minDiversity: 0.3, // At least 30% diversity\n    minValidFormatRate: 0.8, // At least 80% valid format\n  };\n\n  const passed =\n    metrics.overall.averageDiversity >= threshold.minDiversity &&\n    metrics.overall.averageValidFormatRate >= threshold.minValidFormatRate;\n\n  console.log('\\nTest Results:');\n  console.log(`  Average Diversity: ${(metrics.overall.averageDiversity * 100).toFixed(2)}%`);\n  console.log(`  Average Valid Format Rate: ${(metrics.overall.averageValidFormatRate * 100).toFixed(2)}%`);\n  console.log(`  Test ${passed ? 'PASSED' : 'FAILED'}`);\n\n  return {\n    metrics,\n    passed,\n    threshold,\n  };\n}\n\n/**\n * Save test results\n */\nexport async function saveTestResults(\n  result: TestResult,\n  outputDir: string\n): Promise<{ metricsPath: string; reportPath: string }> {\n  const fs = await import('fs');\n  const path = await import('path');\n\n  if (!fs.existsSync(outputDir)) {\n    fs.mkdirSync(outputDir, { recursive: true });\n  }\n\n  const metricsPath = path.join(outputDir, 'test_metrics.json');\n  const reportPath = path.join(outputDir, 'test_report.md');\n\n  await MetricsCollector.saveMetrics(result.metrics, metricsPath);\n  await MetricsCollector.saveReport(result.metrics, reportPath);\n\n  // Add test pass/fail status to report\n  const report = MetricsCollector.generateReport(result.metrics);\n  const fullReport = `${report}\\n\\n## Test Status\\n\\n**Result:** ${result.passed ? '✅ PASSED' : '❌ FAILED'}\\n\\n**Thresholds:**\\n- Minimum Diversity: ${(result.threshold!.minDiversity * 100).toFixed(0)}%\\n- Minimum Valid Format Rate: ${(result.threshold!.minValidFormatRate * 100).toFixed(0)}%\\n`;\n  fs.writeFileSync(reportPath, fullReport);\n\n  console.log(`Test results saved to: ${outputDir}`);\n  return { metricsPath, reportPath };\n}\n\n\n\n","/**\n * Validate OmegaSynth model on validation dataset\n */\n\nimport { OmegaSynth } from '../OmegaSynth';\nimport { loadTrainingDataFile, combineTrainingData } from './loadTrainingData';\nimport { MetricsCollector, ModelMetrics } from '../evaluation/Metrics';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface ValidationConfig {\n  model: OmegaSynth;\n  validationFile: string;\n  samplesPerLabel?: number;\n}\n\nexport interface ValidationResult {\n  metrics: ModelMetrics;\n  passed: boolean;\n  threshold?: {\n    minDiversity: number;\n    minValidFormatRate: number;\n  };\n}\n\n/**\n * Validate the model on validation dataset\n */\nexport async function validateModel(\n  config: ValidationConfig\n): Promise<ValidationResult> {\n  console.log('Starting model validation...');\n  console.log(`Validation file: ${config.validationFile}`);\n\n  // Load validation data\n  const validationData = loadTrainingDataFile(config.validationFile);\n  const validationSamples = combineTrainingData([validationData]);\n\n  // Group validation samples by label\n  const expectedByLabel: Record<string, string[]> = {};\n  for (const sample of validationSamples) {\n    if (!expectedByLabel[sample.label]) {\n      expectedByLabel[sample.label] = [];\n    }\n    expectedByLabel[sample.label].push(sample.value);\n  }\n\n  // Generate samples for each label\n  const samplesPerLabel = config.samplesPerLabel || 20;\n  const generatedByLabel: Record<string, string[]> = {};\n\n  console.log(`Generating ${samplesPerLabel} samples per label...`);\n  for (const label of Object.keys(expectedByLabel)) {\n    try {\n      const generated = await config.model.generateBatch(\n        label,\n        samplesPerLabel\n      );\n      generatedByLabel[label] = generated;\n      console.log(`  ${label}: ${generated.length} samples generated`);\n    } catch (error) {\n      console.error(`  Error generating for ${label}:`, error);\n      generatedByLabel[label] = [];\n    }\n  }\n\n  // Collect metrics\n  const metrics = MetricsCollector.collectMetrics(\n    generatedByLabel,\n    expectedByLabel\n  );\n\n  // Determine if validation passed\n  const threshold = {\n    minDiversity: 0.4, // At least 40% diversity (stricter than test)\n    minValidFormatRate: 0.85, // At least 85% valid format (stricter than test)\n  };\n\n  const passed =\n    metrics.overall.averageDiversity >= threshold.minDiversity &&\n    metrics.overall.averageValidFormatRate >= threshold.minValidFormatRate;\n\n  console.log('\\nValidation Results:');\n  console.log(`  Average Diversity: ${(metrics.overall.averageDiversity * 100).toFixed(2)}%`);\n  console.log(`  Average Valid Format Rate: ${(metrics.overall.averageValidFormatRate * 100).toFixed(2)}%`);\n  console.log(`  Validation ${passed ? 'PASSED' : 'FAILED'}`);\n\n  return {\n    metrics,\n    passed,\n    threshold,\n  };\n}\n\n/**\n * Save validation results\n */\nexport async function saveValidationResults(\n  result: ValidationResult,\n  outputDir: string\n): Promise<{ metricsPath: string; reportPath: string }> {\n  const fs = await import('fs');\n  const path = await import('path');\n\n  if (!fs.existsSync(outputDir)) {\n    fs.mkdirSync(outputDir, { recursive: true });\n  }\n\n  const metricsPath = path.join(outputDir, 'validation_metrics.json');\n  const reportPath = path.join(outputDir, 'validation_report.md');\n\n  await MetricsCollector.saveMetrics(result.metrics, metricsPath);\n  await MetricsCollector.saveReport(result.metrics, reportPath);\n\n  // Add validation pass/fail status to report\n  const report = MetricsCollector.generateReport(result.metrics);\n  const fullReport = `${report}\\n\\n## Validation Status\\n\\n**Result:** ${result.passed ? '✅ PASSED' : '❌ FAILED'}\\n\\n**Thresholds:**\\n- Minimum Diversity: ${(result.threshold!.minDiversity * 100).toFixed(0)}%\\n- Minimum Valid Format Rate: ${(result.threshold!.minValidFormatRate * 100).toFixed(0)}%\\n`;\n  fs.writeFileSync(reportPath, fullReport);\n\n  console.log(`Validation results saved to: ${outputDir}`);\n  return { metricsPath, reportPath };\n}\n\n\n\n","/**\n * Save versioned model with all artifacts\n */\n\nimport { TrainedModel } from './trainModel';\nimport { TestResult } from './testModel';\nimport { ValidationResult } from './validateModel';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface VersionedModelManifest {\n  version: string;\n  timestamp: string;\n  config: {\n    mode: string;\n    maxLength?: number;\n    seed?: number;\n  };\n  trainingStats: {\n    totalSamples: number;\n    labels: string[];\n    samplesPerLabel: Record<string, number>;\n  };\n  testResults: {\n    passed: boolean;\n    averageDiversity: number;\n    averageValidFormatRate: number;\n  };\n  validationResults: {\n    passed: boolean;\n    averageDiversity: number;\n    averageValidFormatRate: number;\n  };\n  artifacts: {\n    model: string;\n    elmModel?: string;\n    testMetrics: string;\n    testReport: string;\n    validationMetrics: string;\n    validationReport: string;\n    manifest: string;\n  };\n}\n\n/**\n * Save versioned model distribution\n */\nexport async function saveVersionedModel(\n  model: TrainedModel,\n  testResult: TestResult,\n  validationResult: ValidationResult,\n  baseOutputDir: string,\n  version: string = '2.0.0'\n): Promise<string> {\n  const versionDir = path.join(baseOutputDir, `v${version}`);\n  \n  if (!fs.existsSync(versionDir)) {\n    fs.mkdirSync(versionDir, { recursive: true });\n  }\n\n  // Save model\n  const modelPath = path.join(versionDir, 'model.json');\n  const modelData = {\n    config: model.config,\n    trainingStats: model.trainingStats,\n    timestamp: new Date().toISOString(),\n  };\n  fs.writeFileSync(modelPath, JSON.stringify(modelData, null, 2));\n\n  // Save combined training data so we can reconstruct OmegaSynth later\n  const trainingDataPath = path.join(versionDir, 'training_data.json');\n  try {\n    fs.writeFileSync(\n      trainingDataPath,\n      JSON.stringify(model.trainingSamples, null, 2)\n    );\n    console.log(`Training data saved to: ${trainingDataPath}`);\n  } catch (err) {\n    console.warn('Could not save training_data.json:', err);\n  }\n\n  // Save ELM model weights if available\n  if (model.elmModelJSON) {\n    const elmModelPath = path.join(versionDir, 'elm_model.json');\n    fs.writeFileSync(elmModelPath, model.elmModelJSON);\n    console.log(`ELM model weights saved to: ${elmModelPath}`);\n  }\n\n  // Copy test results\n  const testMetricsPath = path.join(versionDir, 'test_metrics.json');\n  const testReportPath = path.join(versionDir, 'test_report.md');\n  \n  // Copy validation results\n  const validationMetricsPath = path.join(versionDir, 'validation_metrics.json');\n  const validationReportPath = path.join(versionDir, 'validation_report.md');\n\n  // Create manifest\n  const manifest: VersionedModelManifest = {\n    version,\n    timestamp: new Date().toISOString(),\n    config: {\n      mode: model.config.mode,\n      maxLength: model.config.maxLength,\n      seed: model.config.seed,\n    },\n    trainingStats: model.trainingStats,\n    testResults: {\n      passed: testResult.passed,\n      averageDiversity: testResult.metrics.overall.averageDiversity,\n      averageValidFormatRate: testResult.metrics.overall.averageValidFormatRate,\n    },\n    validationResults: {\n      passed: validationResult.passed,\n      averageDiversity: validationResult.metrics.overall.averageDiversity,\n      averageValidFormatRate: validationResult.metrics.overall.averageValidFormatRate,\n    },\n    artifacts: {\n      model: 'model.json',\n      elmModel: model.elmModelJSON ? 'elm_model.json' : undefined,\n      testMetrics: 'test_metrics.json',\n      testReport: 'test_report.md',\n      validationMetrics: 'validation_metrics.json',\n      validationReport: 'validation_report.md',\n      manifest: 'manifest.json',\n    },\n  };\n\n  const manifestPath = path.join(versionDir, 'manifest.json');\n  fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n\n  console.log(`\\n✅ Versioned model saved to: ${versionDir}`);\n  console.log(`   Version: ${version}`);\n  console.log(`   Test: ${testResult.passed ? 'PASSED' : 'FAILED'}`);\n  console.log(`   Validation: ${validationResult.passed ? 'PASSED' : 'FAILED'}`);\n\n  return versionDir;\n}\n\n","/**\n * Main training, testing, and validation pipeline\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { fileURLToPath } from 'node:url';\nimport { trainModel, saveModel, TrainingConfig } from './trainModel';\nimport { testModel, saveTestResults } from './testModel';\nimport { validateModel, saveValidationResults } from './validateModel';\nimport { saveVersionedModel } from './saveVersionedModel';\nimport { initializeLicense } from '../core/license';\n\n// Resolve paths relative to project root\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst PROJECT_ROOT = process.cwd();\nconst MODELS_DIR = path.join(PROJECT_ROOT, 'src/omegasynth/models');\nconst OUTPUT_DIR = path.join(PROJECT_ROOT, 'dist/models');\n\n/**\n * Main pipeline execution\n */\nasync function main() {\n  // Initialize license runtime\n  initializeLicense();\n\n  console.log('='.repeat(60));\n  console.log('OmegaSynth Training, Testing, and Validation Pipeline');\n  console.log('='.repeat(60));\n  console.log();\n\n  // Step 1: Identify training files\n  console.log('Step 1: Loading training data files...');\n  const trainingFiles: string[] = [];\n  const entries = fs.readdirSync(MODELS_DIR);\n  \n  for (const entry of entries) {\n    if (\n      entry.endsWith('.json') &&\n      !entry.includes('test') &&\n      !entry.includes('val') &&\n      entry !== 'default_synth.json'\n    ) {\n      trainingFiles.push(path.join(MODELS_DIR, entry));\n    }\n  }\n\n  if (trainingFiles.length === 0) {\n    throw new Error('No training data files found!');\n  }\n\n  console.log(`Found ${trainingFiles.length} training files:`);\n  trainingFiles.forEach(file => console.log(`  - ${path.basename(file)}`));\n  console.log();\n\n  // Step 2: Train model\n  console.log('Step 2: Training model...');\n  // Use hybrid mode which combines retrieval + ELM for best results\n  const trainingConfig: TrainingConfig = {\n    mode: 'hybrid', // Using hybrid mode (retrieval + ELM)\n    maxLength: 50,\n    seed: 42,\n    trainingFiles,\n  };\n\n  const trainedModel = await trainModel(trainingConfig);\n  console.log('✅ Training complete!\\n');\n\n  // Step 3: Test model\n  console.log('Step 3: Testing model...');\n  const testFile = path.join(MODELS_DIR, 'omegaSynth_training_data_huge_test.json');\n  \n  if (!fs.existsSync(testFile)) {\n    throw new Error(`Test file not found: ${testFile}`);\n  }\n\n  const testResult = await testModel({\n    model: trainedModel.synth,\n    testFile,\n    samplesPerLabel: 10,\n  });\n\n  // Save test results to temp directory\n  const testOutputDir = path.join(OUTPUT_DIR, 'temp_test');\n  await saveTestResults(testResult, testOutputDir);\n\n  if (!testResult.passed) {\n    console.log('\\n❌ Test failed! Stopping pipeline.');\n    console.log('   Model will not be saved.');\n    process.exit(1);\n  }\n\n  console.log('✅ Test passed!\\n');\n\n  // Step 4: Validate model\n  console.log('Step 4: Validating model...');\n  const validationFile = path.join(\n    MODELS_DIR,\n    'omegaSynth_training_data_huge_val.json'\n  );\n\n  if (!fs.existsSync(validationFile)) {\n    throw new Error(`Validation file not found: ${validationFile}`);\n  }\n\n  const validationResult = await validateModel({\n    model: trainedModel.synth,\n    validationFile,\n    samplesPerLabel: 20,\n  });\n\n  // Save validation results to temp directory\n  const validationOutputDir = path.join(OUTPUT_DIR, 'temp_validation');\n  await saveValidationResults(validationResult, validationOutputDir);\n\n  if (!validationResult.passed) {\n    console.log('\\n❌ Validation failed! Stopping pipeline.');\n    console.log('   Model will not be saved.');\n    process.exit(1);\n  }\n\n  console.log('✅ Validation passed!\\n');\n\n  // Step 5: Save versioned model\n  console.log('Step 5: Saving versioned model...');\n  const version = '2.0.0';\n  const versionedDir = await saveVersionedModel(\n    trainedModel,\n    testResult,\n    validationResult,\n    OUTPUT_DIR,\n    version\n  );\n\n  // Copy test and validation results to versioned directory\n  const testMetricsSrc = path.join(testOutputDir, 'test_metrics.json');\n  const testReportSrc = path.join(testOutputDir, 'test_report.md');\n  const validationMetricsSrc = path.join(validationOutputDir, 'validation_metrics.json');\n  const validationReportSrc = path.join(validationOutputDir, 'validation_report.md');\n\n  fs.copyFileSync(testMetricsSrc, path.join(versionedDir, 'test_metrics.json'));\n  fs.copyFileSync(testReportSrc, path.join(versionedDir, 'test_report.md'));\n  fs.copyFileSync(validationMetricsSrc, path.join(versionedDir, 'validation_metrics.json'));\n  fs.copyFileSync(validationReportSrc, path.join(versionedDir, 'validation_report.md'));\n\n  // Clean up temp directories\n  fs.rmSync(testOutputDir, { recursive: true, force: true });\n  fs.rmSync(validationOutputDir, { recursive: true, force: true });\n\n  console.log('\\n' + '='.repeat(60));\n  console.log('Pipeline Complete!');\n  console.log('='.repeat(60));\n  console.log(`Model saved to: ${versionedDir}`);\n  console.log(`Version: ${version}`);\n  console.log(`Test: ${testResult.passed ? '✅ PASSED' : '❌ FAILED'}`);\n  console.log(`Validation: ${validationResult.passed ? '✅ PASSED' : '❌ FAILED'}`);\n}\n\n// Run pipeline unconditionally in bundled entry\nmain().catch(error => {\n  console.error('Pipeline failed:', error);\n  process.exit(1);\n});\n\nexport { main as runPipeline };\n\n"],"names":["SeededRNG","vocabSize","crypto","fs","path","__filename"],"mappings":"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","x_google_ignoreList":[14,15,16,17,18,19,20]}