{"version":3,"sources":["../src/core/types.ts","../src/core/scorers/exact.ts","../src/core/dictionaries/generic.ts","../src/core/scorers/alias.ts","../src/core/scorers/pattern-type.ts","../src/core/scorers/profile.ts","../src/core/util/string-distance.ts","../src/core/scorers/fuzzy-name.ts","../src/core/scorers/initialism.ts","../src/core/scorers/registry.ts","../src/core/assignment/hungarian.ts","../src/core/dictionaries/healthcare.ts","../src/core/dictionaries/finance.ts","../src/core/dictionaries/ecommerce.ts","../src/core/dictionaries/index.ts","../src/core/engine.ts","../src/core/config.ts","../src/core/util/csv.ts","../src/core/util/profile.ts","../src/core/providers/in-memory.ts","../src/core/providers/file.ts","../src/core/providers/schema-file.ts","../src/node/fs.ts","../src/node/db/types.ts","../src/node/db/provider.ts","../src/cli.ts"],"names":["v","_","DOMAIN","round","path","basename","extname","readFile","parseArgs","writeFile","pathToFileURL"],"mappings":"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","file":"cli.cjs","sourcesContent":["// Core data types. Mirrors infermap/types.py.\n// Uses interfaces + factory functions instead of classes so results are plain\n// JSON-serializable — important for parity tests and Next.js Server → Client payloads.\n\nexport const VALID_DTYPES = [\n  \"string\",\n  \"integer\",\n  \"float\",\n  \"boolean\",\n  \"date\",\n  \"datetime\",\n] as const;\n\nexport type Dtype = (typeof VALID_DTYPES)[number];\n\nexport interface FieldInfo {\n  name: string;\n  dtype: Dtype;\n  sampleValues: string[];\n  nullRate: number;\n  uniqueRate: number;\n  valueCount: number;\n  metadata: Record<string, unknown>;\n  /** Affix-stripped canonical form populated by the engine. Optional. */\n  canonicalName?: string;\n}\n\nexport interface SchemaInfo {\n  fields: FieldInfo[];\n  sourceName: string;\n  requiredFields: string[];\n}\n\nexport interface ScorerResult {\n  score: number; // clamped to [0, 1]\n  reasoning: string;\n}\n\nexport interface FieldMapping {\n  source: string;\n  target: string;\n  confidence: number;\n  breakdown: Record<string, ScorerResult>;\n  reasoning: string;\n}\n\nexport interface MapResult {\n  mappings: FieldMapping[];\n  unmappedSource: string[];\n  unmappedTarget: string[];\n  warnings: string[];\n  metadata: Record<string, unknown>;\n  scoreMatrix?: Record<string, Record<string, number>>;\n}\n\n// ---------- factories + normalization ----------\n\nconst isValidDtype = (d: unknown): d is Dtype =>\n  typeof d === \"string\" && (VALID_DTYPES as readonly string[]).includes(d);\n\nexport function makeFieldInfo(input: {\n  name: string;\n  dtype?: string;\n  sampleValues?: string[];\n  nullRate?: number;\n  uniqueRate?: number;\n  valueCount?: number;\n  metadata?: Record<string, unknown>;\n}): FieldInfo {\n  return {\n    name: input.name,\n    dtype: isValidDtype(input.dtype) ? input.dtype : \"string\",\n    sampleValues: input.sampleValues ?? [],\n    nullRate: input.nullRate ?? 0,\n    uniqueRate: input.uniqueRate ?? 0,\n    valueCount: input.valueCount ?? 0,\n    metadata: input.metadata ?? {},\n  };\n}\n\nexport function makeSchemaInfo(input: {\n  fields: FieldInfo[];\n  sourceName?: string;\n  requiredFields?: string[];\n}): SchemaInfo {\n  return {\n    fields: input.fields,\n    sourceName: input.sourceName ?? \"\",\n    requiredFields: input.requiredFields ?? [],\n  };\n}\n\nexport function clampScore(score: number): number {\n  if (Number.isNaN(score)) return 0;\n  return Math.max(0, Math.min(1, score));\n}\n\nexport function makeScorerResult(score: number, reasoning: string): ScorerResult {\n  return { score: clampScore(score), reasoning };\n}\n\n// ---------- MapResult helpers (mirror Python .report() / .to_json()) ----------\n\nconst round = (n: number, digits: number): number => {\n  const factor = 10 ** digits;\n  return Math.round(n * factor) / factor;\n};\n\nexport interface MapResultReport {\n  mappings: Array<{\n    source: string;\n    target: string;\n    confidence: number;\n    breakdown: Record<string, { score: number; reasoning: string }>;\n    reasoning: string;\n  }>;\n  unmapped_source: string[];\n  unmapped_target: string[];\n  warnings: string[];\n}\n\nexport function mapResultToReport(result: MapResult): MapResultReport {\n  return {\n    mappings: result.mappings.map((m) => ({\n      source: m.source,\n      target: m.target,\n      confidence: round(m.confidence, 3),\n      breakdown: Object.fromEntries(\n        Object.entries(m.breakdown).map(([k, r]) => [\n          k,\n          { score: round(r.score, 3), reasoning: r.reasoning },\n        ])\n      ),\n      reasoning: m.reasoning,\n    })),\n    unmapped_source: result.unmappedSource,\n    unmapped_target: result.unmappedTarget,\n    warnings: result.warnings,\n  };\n}\n\nexport function mapResultToJson(result: MapResult): string {\n  return JSON.stringify(mapResultToReport(result), null, 2);\n}\n","// Exact name scorer — case-insensitive exact field name match.\n// Mirrors infermap/scorers/exact.py.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\nimport { getInfermapBackend } from \"../wasm/backend.js\";\n\nexport class ExactScorer implements Scorer {\n  readonly name = \"ExactScorer\";\n  readonly weight = 1.0;\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult {\n    const backend = getInfermapBackend();\n    const sim = backend\n      ? backend.exactScore(source.name, target.name)\n      : source.name.trim().toLowerCase() === target.name.trim().toLowerCase()\n        ? 1.0\n        : 0.0;\n    if (sim === 1.0) {\n      return makeScorerResult(1.0, `Exact name match: '${source.name}'`);\n    }\n    return makeScorerResult(\n      0.0,\n      `No exact match: '${source.name}' vs '${target.name}'`\n    );\n  }\n}\n","// Generic domain dictionary — PII, customer, order, common system fields.\n// Mirrors infermap/dictionaries/generic.yaml.\nexport const DOMAIN: Record<string, readonly string[]> = {\n  first_name: [\"fname\", \"first\", \"given_name\", \"first_nm\", \"forename\"],\n  last_name: [\"lname\", \"last\", \"surname\", \"family_name\", \"last_nm\"],\n  email: [\"email_address\", \"e_mail\", \"email_addr\", \"mail\", \"contact_email\"],\n  phone: [\"phone_number\", \"ph\", \"telephone\", \"tel\", \"mobile\", \"cell\"],\n  address: [\n    \"addr\",\n    \"street_address\",\n    \"addr_line_1\",\n    \"address_line_1\",\n    \"mailing_address\",\n  ],\n  city: [\"town\", \"municipality\"],\n  state: [\"st\", \"province\", \"region\"],\n  zip: [\"zipcode\", \"zip_code\", \"postal_code\", \"postal\", \"postcode\"],\n  name: [\n    \"full_name\",\n    \"fullname\",\n    \"customer_name\",\n    \"display_name\",\n    \"contact_name\",\n  ],\n  company: [\n    \"organization\",\n    \"org\",\n    \"business\",\n    \"employer\",\n    \"firm\",\n    \"company_name\",\n  ],\n  dob: [\"date_of_birth\", \"birth_date\", \"birthdate\", \"birthday\"],\n  country: [\"nation\", \"country_code\"],\n  gender: [\"sex\"],\n  id: [\"identifier\", \"record_id\", \"uid\"],\n  created_at: [\"signup_date\", \"create_date\", \"date_created\"],\n};\n","// Alias scorer — matches fields that are known synonyms of each other.\n// Mirrors infermap/scorers/alias.py.\n//\n// The module-level DEFAULT_ALIASES is seeded from the shipped `generic`\n// domain. The scorer supports two modes:\n//\n//   * `new AliasScorer()` or `new AliasScorer({ extra: ... })` — merges\n//     extras into DEFAULT_ALIASES (backward compatible with TS callers\n//     that pre-date the domain-dictionaries feature).\n//   * `new AliasScorer({ aliases: dict })` — per-instance alias dict that\n//     replaces the defaults entirely. Mirrors the Python `aliases=` param\n//     and is what `MapEngine({ domains: [...] })` uses internally.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport { DOMAIN as GENERIC } from \"../dictionaries/generic.js\";\nimport type { Scorer } from \"./base.js\";\n\n/** Default alias dict, seeded from the shipped `generic` domain. */\nexport const DEFAULT_ALIASES: Record<string, readonly string[]> = { ...GENERIC };\n\n/** Build a reverse lookup: every alias (and canonical) -> canonical key. */\nexport function buildLookup(\n  aliases: Record<string, readonly string[]>\n): Map<string, string> {\n  const lookup = new Map<string, string>();\n  for (const [canonical, list] of Object.entries(aliases)) {\n    lookup.set(canonical.trim().toLowerCase(), canonical);\n    for (const alias of list) {\n      lookup.set(alias.trim().toLowerCase(), canonical);\n    }\n  }\n  return lookup;\n}\n\nexport interface AliasScorerOptions {\n  /** Per-instance alias dict that REPLACES defaults. */\n  aliases?: Record<string, readonly string[]>;\n}\n\nexport class AliasScorer implements Scorer {\n  readonly name = \"AliasScorer\";\n  readonly weight = 0.95;\n\n  private readonly lookup: Map<string, string>;\n\n  constructor(\n    arg?: Record<string, readonly string[]> | AliasScorerOptions\n  ) {\n    // Two shapes supported:\n    //   AliasScorer({ aliases: {...} })  -> replace defaults (new Python path)\n    //   AliasScorer({ foo: [...] })      -> extras merged into defaults (legacy)\n    //   AliasScorer(undefined)           -> defaults\n    if (\n      arg &&\n      typeof arg === \"object\" &&\n      \"aliases\" in arg &&\n      (arg as AliasScorerOptions).aliases\n    ) {\n      this.lookup = buildLookup((arg as AliasScorerOptions).aliases!);\n      return;\n    }\n    const extras = (arg ?? {}) as Record<string, readonly string[]>;\n    const merged: Record<string, readonly string[]> = { ...DEFAULT_ALIASES };\n    for (const [canonical, list] of Object.entries(extras)) {\n      merged[canonical] = list;\n    }\n    this.lookup = buildLookup(merged);\n  }\n\n  private canonical(name: string): string | undefined {\n    return this.lookup.get(name.trim().toLowerCase());\n  }\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult | null {\n    const srcName = source.name.trim().toLowerCase();\n    const tgtName = target.name.trim().toLowerCase();\n\n    const srcCanonical = this.canonical(srcName);\n    const tgtCanonical = this.canonical(tgtName);\n\n    const declaredRaw = target.metadata[\"aliases\"];\n    const declaredAliases: string[] = Array.isArray(declaredRaw)\n      ? (declaredRaw as unknown[]).filter((x): x is string => typeof x === \"string\")\n      : [];\n    const declaredLower = declaredAliases.map((a) => a.trim().toLowerCase());\n    const targetHasDeclared = declaredAliases.length > 0;\n\n    if (declaredLower.includes(srcName)) {\n      return makeScorerResult(\n        0.95,\n        `'${source.name}' matches declared alias of target '${target.name}'`\n      );\n    }\n\n    if (\n      srcCanonical === undefined &&\n      tgtCanonical === undefined &&\n      !targetHasDeclared\n    ) {\n      return null;\n    }\n\n    if (srcCanonical !== undefined && srcCanonical === tgtCanonical) {\n      return makeScorerResult(\n        0.95,\n        `'${source.name}' and '${target.name}' share canonical name '${srcCanonical}'`\n      );\n    }\n\n    return makeScorerResult(\n      0.0,\n      `'${source.name}' (canonical=${srcCanonical ?? \"None\"}) and ` +\n        `'${target.name}' (canonical=${tgtCanonical ?? \"None\"}) are different`\n    );\n  }\n}\n","// Pattern-type scorer — detects semantic types from sample values via regex.\n// Mirrors infermap/scorers/pattern_type.py.\n//\n// All Python regexes are compatible with JS RegExp as-is: they use ^...$\n// anchors with no multiline flag, so full-string matching is identical.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\nimport { getInfermapBackend } from \"../wasm/backend.js\";\n\n/**\n * Ordered registry — iteration order matches insertion order, so earlier\n * entries take precedence on ambiguous samples. Matches the Python dict order.\n */\nexport const SEMANTIC_TYPES: Record<string, RegExp> = {\n  email: /^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$/,\n  uuid: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,\n  date_iso: /^\\d{4}-\\d{2}-\\d{2}$/,\n  ip_v4: /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n  url: /^https?:\\/\\/[^\\s]+$/,\n  phone: /^[\\+\\d]?(\\d[\\s\\-\\.]?){7,14}\\d$/,\n  zip_us: /^\\d{5}(-\\d{4})?$/,\n  currency: /^[\\$\\£\\€]\\s?\\d[\\d,]*(\\.\\d{1,2})?$/,\n};\n\nconst cleanSamples = (samples: readonly string[]): string[] =>\n  samples.filter((s) => s != null && String(s).trim() !== \"\");\n\n/** Bitmask oracle: bit i set iff s matches SEMANTIC_TYPES[i] (insertion order).\n *  s is expected pre-stripped by the caller. Mirrors the Rust pattern_match_types. */\nexport function _matchTypesPure(s: string): number {\n  let mask = 0;\n  let i = 0;\n  for (const pattern of Object.values(SEMANTIC_TYPES)) {\n    if (pattern.test(s)) mask |= 1 << i;\n    i++;\n  }\n  return mask;\n}\n\nfunction _matchTypesBatch(stripped: string[]): number[] {\n  const backend = getInfermapBackend();\n  return backend\n    ? backend.patternMatchTypes(stripped)\n    : stripped.map(_matchTypesPure);\n}\n\nfunction classifyWithPct(\n  field: FieldInfo,\n  threshold = 0.6\n): { type: string | null; pct: number } {\n  const samples = cleanSamples(field.sampleValues).map((s) => String(s).trim());\n  if (samples.length === 0) return { type: null, pct: 0 };\n\n  const masks = _matchTypesBatch(samples);\n  const names = Object.keys(SEMANTIC_TYPES);\n  let bestType: string | null = null;\n  let bestPct = 0;\n  for (let i = 0; i < names.length; i++) {\n    let matches = 0;\n    for (const m of masks) if (m & (1 << i)) matches++;\n    const pct = matches / samples.length;\n    if (pct > bestPct) {\n      bestPct = pct;\n      bestType = names[i]!;\n    }\n  }\n  if (bestType !== null && bestPct >= threshold) {\n    return { type: bestType, pct: bestPct };\n  }\n  return { type: null, pct: 0 };\n}\n\nexport function classifyField(\n  field: FieldInfo,\n  threshold = 0.6\n): string | null {\n  return classifyWithPct(field, threshold).type;\n}\n\nconst pctStr = (p: number): string => `${Math.round(p * 100)}%`;\n\nexport class PatternTypeScorer implements Scorer {\n  readonly name = \"PatternTypeScorer\";\n  readonly weight = 0.7;\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult | null {\n    const srcSamples = cleanSamples(source.sampleValues);\n    const tgtSamples = cleanSamples(target.sampleValues);\n\n    if (srcSamples.length === 0 || tgtSamples.length === 0) return null;\n\n    const { type: srcType, pct: srcPct } = classifyWithPct(source);\n    const { type: tgtType, pct: tgtPct } = classifyWithPct(target);\n\n    if (srcType === null && tgtType === null) {\n      return makeScorerResult(\n        0.0,\n        \"No semantic type detected in either field's samples\"\n      );\n    }\n\n    if (srcType !== tgtType) {\n      return makeScorerResult(\n        0.0,\n        `Semantic type mismatch: source='${srcType ?? \"None\"}' vs target='${tgtType ?? \"None\"}'`\n      );\n    }\n\n    const combined = Math.min(srcPct, tgtPct);\n    return makeScorerResult(\n      combined,\n      `Both fields classified as '${srcType}' (src=${pctStr(srcPct)}, tgt=${pctStr(tgtPct)})`\n    );\n  }\n}\n","// Profile scorer — compares statistical profiles of two fields.\n// Mirrors infermap/scorers/profile.py.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\nimport { getInfermapBackend } from \"../wasm/backend.js\";\n\nconst fmt2 = (n: number): string => n.toFixed(2);\n\nfunction avgValueLength(samples: readonly string[]): number {\n  const clean = samples.filter((s) => s != null && String(s).trim() !== \"\");\n  if (clean.length === 0) return 0;\n  let total = 0;\n  for (const s of clean) total += String(s).length;\n  return total / clean.length;\n}\n\nfunction similarity(a: number, b: number): number {\n  return Math.max(0, 1 - Math.abs(a - b));\n}\n\n/** Pure five-add profile math — the single source for the pure fallback AND the\n *  WASM parity oracle. Byte-identical to infermap-core::profile_score. Caller owns\n *  the abstain (valueCount===0), avg-length reduction, and reasoning. */\nexport function _profileScorePure(\n  srcDtype: string,\n  tgtDtype: string,\n  srcNull: number,\n  tgtNull: number,\n  srcUniq: number,\n  tgtUniq: number,\n  srcValCount: number,\n  tgtValCount: number,\n  srcAvgLen: number,\n  tgtAvgLen: number,\n): number {\n  let total = 0;\n  total += 0.4 * (srcDtype === tgtDtype ? 1 : 0);\n  total += 0.2 * similarity(srcNull, tgtNull);\n  total += 0.2 * similarity(srcUniq, tgtUniq);\n  const maxLen = Math.max(srcAvgLen, tgtAvgLen, 1);\n  total += 0.1 * (1 - Math.abs(srcAvgLen - tgtAvgLen) / maxLen);\n  const srcCard = srcUniq * srcValCount;\n  const tgtCard = tgtUniq * tgtValCount;\n  const maxCard = Math.max(srcCard, tgtCard, 1);\n  total += 0.1 * (1 - Math.abs(srcCard - tgtCard) / maxCard);\n  return total;\n}\n\n/**\n * Profile comparison dimensions and weights:\n *   dtype match        0.4\n *   null rate          0.2\n *   uniqueness rate    0.2\n *   value length       0.1\n *   cardinality ratio  0.1\n */\nexport class ProfileScorer implements Scorer {\n  readonly name = \"ProfileScorer\";\n  readonly weight = 0.5;\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult | null {\n    if (source.valueCount === 0 || target.valueCount === 0) return null;\n\n    const srcLen = avgValueLength(source.sampleValues);\n    const tgtLen = avgValueLength(target.sampleValues);\n\n    const backend = getInfermapBackend();\n    const total = backend\n      ? backend.profileScore(\n          source.dtype, target.dtype,\n          source.nullRate, target.nullRate,\n          source.uniqueRate, target.uniqueRate,\n          source.valueCount, target.valueCount,\n          srcLen, tgtLen,\n        )\n      : _profileScorePure(\n          source.dtype, target.dtype,\n          source.nullRate, target.nullRate,\n          source.uniqueRate, target.uniqueRate,\n          source.valueCount, target.valueCount,\n          srcLen, tgtLen,\n        );\n\n    const dtypeMatch = source.dtype === target.dtype ? 1 : 0;\n    const nullSim = similarity(source.nullRate, target.nullRate);\n    const uniqSim = similarity(source.uniqueRate, target.uniqueRate);\n    const maxLen = Math.max(srcLen, tgtLen, 1);\n    const lenSim = 1 - Math.abs(srcLen - tgtLen) / maxLen;\n    const srcCard = source.uniqueRate * source.valueCount;\n    const tgtCard = target.uniqueRate * target.valueCount;\n    const maxCard = Math.max(srcCard, tgtCard, 1);\n    const cardSim = 1 - Math.abs(srcCard - tgtCard) / maxCard;\n    const parts = [\n      `dtype=${dtypeMatch ? \"match\" : \"mismatch\"}`,\n      `null_sim=${fmt2(nullSim)}`,\n      `uniq_sim=${fmt2(uniqSim)}`,\n      `len_sim=${fmt2(lenSim)}`,\n      `card_sim=${fmt2(cardSim)}`,\n    ];\n    return makeScorerResult(total, `Profile comparison: ${parts.join(\", \")}`);\n  }\n}\n","// Vendored string distance utilities.\n//\n// jaroWinklerSimilarity matches rapidfuzz.distance.JaroWinkler.similarity:\n// prefix scaling p=0.1, max prefix length 4, boost applied only when base Jaro\n// similarity >= 0.7 (classic Winkler threshold).\n\nexport function jaroSimilarity(s1: string, s2: string): number {\n  if (s1 === s2) return 1;\n  const len1 = s1.length;\n  const len2 = s2.length;\n  if (len1 === 0 || len2 === 0) return 0;\n\n  const matchWindow = Math.max(0, Math.floor(Math.max(len1, len2) / 2) - 1);\n  const s1Matches = new Array<boolean>(len1).fill(false);\n  const s2Matches = new Array<boolean>(len2).fill(false);\n\n  let matches = 0;\n  for (let i = 0; i < len1; i++) {\n    const start = Math.max(0, i - matchWindow);\n    const end = Math.min(i + matchWindow + 1, len2);\n    for (let j = start; j < end; j++) {\n      if (s2Matches[j]) continue;\n      if (s1[i] !== s2[j]) continue;\n      s1Matches[i] = true;\n      s2Matches[j] = true;\n      matches++;\n      break;\n    }\n  }\n\n  if (matches === 0) return 0;\n\n  // Count transpositions (half the out-of-order matched chars)\n  let k = 0;\n  let transpositions = 0;\n  for (let i = 0; i < len1; i++) {\n    if (!s1Matches[i]) continue;\n    while (!s2Matches[k]) k++;\n    if (s1[i] !== s2[k]) transpositions++;\n    k++;\n  }\n  transpositions = transpositions / 2;\n\n  return (\n    (matches / len1 + matches / len2 + (matches - transpositions) / matches) / 3\n  );\n}\n\nexport function jaroWinklerSimilarity(\n  s1: string,\n  s2: string,\n  prefixScale = 0.1\n): number {\n  const jaro = jaroSimilarity(s1, s2);\n  if (jaro < 0.7) return jaro;\n\n  let prefix = 0;\n  const maxPrefix = Math.min(4, s1.length, s2.length);\n  for (let i = 0; i < maxPrefix; i++) {\n    if (s1[i] === s2[i]) prefix++;\n    else break;\n  }\n  return jaro + prefix * prefixScale * (1 - jaro);\n}\n\n// Levenshtein distance (vendored for future use by AliasScorer config or\n// other fuzzy matching needs). O(len1 * len2) time, O(min) space.\nexport function levenshteinDistance(s1: string, s2: string): number {\n  if (s1 === s2) return 0;\n  if (s1.length === 0) return s2.length;\n  if (s2.length === 0) return s1.length;\n\n  // Ensure s1 is the shorter — smaller working array\n  if (s1.length > s2.length) [s1, s2] = [s2, s1];\n  const m = s1.length;\n  const n = s2.length;\n\n  let prev = new Array<number>(m + 1);\n  let curr = new Array<number>(m + 1);\n  for (let i = 0; i <= m; i++) prev[i] = i;\n\n  for (let j = 1; j <= n; j++) {\n    curr[0] = j;\n    for (let i = 1; i <= m; i++) {\n      const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n      curr[i] = Math.min(\n        prev[i]! + 1, // deletion\n        curr[i - 1]! + 1, // insertion\n        prev[i - 1]! + cost // substitution\n      );\n    }\n    [prev, curr] = [curr, prev];\n  }\n  return prev[m]!;\n}\n","// Fuzzy name scorer — Jaro-Winkler similarity on normalized field names.\n// Mirrors infermap/scorers/fuzzy_name.py.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport { jaroWinklerSimilarity } from \"../util/string-distance.js\";\nimport type { Scorer } from \"./base.js\";\nimport { getInfermapBackend } from \"../wasm/backend.js\";\n\nconst normalize = (name: string): string =>\n  name.trim().toLowerCase().replace(/[_\\- ]/g, \"\");\n\nexport class FuzzyNameScorer implements Scorer {\n  readonly name = \"FuzzyNameScorer\";\n  readonly weight = 0.4;\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult {\n    const srcName = source.canonicalName ?? source.name;\n    const tgtName = target.canonicalName ?? target.name;\n    const backend = getInfermapBackend();\n    const sim = backend\n      ? backend.fuzzyNameScore(srcName, tgtName)\n      : jaroWinklerSimilarity(normalize(srcName), normalize(tgtName));\n    const srcNorm = normalize(srcName);\n    const tgtNorm = normalize(tgtName);\n    return makeScorerResult(\n      sim,\n      `Jaro-Winkler similarity between '${srcNorm}' and '${tgtNorm}': ${sim.toFixed(3)}`\n    );\n  }\n}\n","// Initialism / abbreviation scorer. Mirrors infermap/scorers/initialism.py.\n//\n// Matches cases where one field name is an abbreviation formed by taking a\n// non-empty prefix of each token from the other, in order. Examples:\n//\n//   assay_id          <-> ASSI    (ASS + I)\n//   confidence_score  <-> CONSC   (CON + SC)\n//   relationship_type <-> RELATIT (RELATI + T)\n//\n// Abstains (returns null) on non-abbreviation pairs.\n\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport { makeScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\nimport { getInfermapBackend } from \"../wasm/backend.js\";\n\n/**\n * Split a field name into lowercase tokens. Handles snake_case, kebab-case,\n * camelCase, PascalCase. Numbers are their own tokens.\n */\nexport function tokenize(name: string): string[] {\n  const cleaned = name.trim().replace(/[_\\-. ]+/g, \" \");\n  const tokens: string[] = [];\n  // Match camelCase/PascalCase runs: acronym runs before a CamelWord, Word, or all-caps run, or digits.\n  const re = /[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|\\d+/g;\n  for (const chunk of cleaned.split(/\\s+/)) {\n    if (!chunk) continue;\n    // Bound the regex input. Column/field names beyond 256 chars aren't\n    // realistic identifiers and the alternation here can backtrack\n    // polynomially on adversarially long all-caps runs.\n    if (chunk.length > 256) continue;\n    const matches = chunk.match(re);\n    if (!matches) continue;\n    for (const m of matches) tokens.push(m.toLowerCase());\n  }\n  return tokens;\n}\n\n/**\n * Is *target* a concatenation of non-empty prefixes of *sourceTokens* in\n * order, using every source token exactly once? DP search.\n */\nexport function isPrefixConcat(target: string, sourceTokens: string[]): boolean {\n  const t = target.toLowerCase();\n  const nSrc = sourceTokens.length;\n  const nTgt = t.length;\n  if (nSrc === 0 || nTgt === 0) return false;\n  // Guard against pathological inputs — abort if the DP table would be\n  // unreasonably large. 200 chars per side is generous for field names.\n  if (nTgt > 200 || nSrc > 50) return false;\n  // dp[i][j] = can target[0:j] be consumed using sourceTokens[0:i]\n  const dp: boolean[][] = Array.from({ length: nSrc + 1 }, () =>\n    new Array<boolean>(nTgt + 1).fill(false)\n  );\n  dp[0]![0] = true;\n  for (let i = 1; i <= nSrc; i++) {\n    const tok = sourceTokens[i - 1]!;\n    for (let j = 1; j <= nTgt; j++) {\n      const maxK = Math.min(tok.length, j);\n      for (let k = 1; k <= maxK; k++) {\n        if (dp[i - 1]![j - k]! && t.slice(j - k, j) === tok.slice(0, k)) {\n          dp[i]![j] = true;\n          break;\n        }\n      }\n    }\n  }\n  return dp[nSrc]![nTgt]!;\n}\n\n/**\n * Return a score in (0, 1] if one side abbreviates the other, else null.\n */\nexport function scorePair(nameA: string, nameB: string): number | null {\n  const tokA = tokenize(nameA);\n  const tokB = tokenize(nameB);\n  const joinedA = tokA.join(\"\");\n  const joinedB = tokB.join(\"\");\n  if (!joinedA || !joinedB) return null;\n  if (joinedA === joinedB) return null;\n\n  let long: string;\n  let short: string;\n  if (isPrefixConcat(joinedB, tokA)) {\n    long = joinedA;\n    short = joinedB;\n  } else if (isPrefixConcat(joinedA, tokB)) {\n    long = joinedB;\n    short = joinedA;\n  } else {\n    return null;\n  }\n  const ratio = short.length / long.length;\n  return 0.6 + 0.35 * ratio;\n}\n\nexport class InitialismScorer implements Scorer {\n  readonly name = \"InitialismScorer\";\n  readonly weight = 0.75;\n\n  score(source: FieldInfo, target: FieldInfo): ScorerResult | null {\n    const srcName = source.canonicalName ?? source.name;\n    const tgtName = target.canonicalName ?? target.name;\n    const backend = getInfermapBackend();\n    const s = backend\n      ? backend.initialismScore(srcName, tgtName)\n      : scorePair(srcName, tgtName);\n    if (s === null) return null;\n    return makeScorerResult(\n      s,\n      `Initialism/abbreviation match: '${srcName}' <-> '${tgtName}' (score=${s.toFixed(3)})`\n    );\n  }\n}\n","// Default scorer list and a helper for defining function-style scorers.\n// Mirrors infermap/scorers/__init__.py.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\nimport { ExactScorer } from \"./exact.js\";\nimport { AliasScorer } from \"./alias.js\";\nimport { PatternTypeScorer } from \"./pattern-type.js\";\nimport { ProfileScorer } from \"./profile.js\";\nimport { FuzzyNameScorer } from \"./fuzzy-name.js\";\nimport { InitialismScorer } from \"./initialism.js\";\n\nexport function defaultScorers(): Scorer[] {\n  return [\n    new ExactScorer(),\n    new AliasScorer(),\n    new PatternTypeScorer(),\n    new ProfileScorer(),\n    new FuzzyNameScorer(),\n    new InitialismScorer(),\n  ];\n}\n\n/** Build a Scorer from a plain function. Matches the Python `@scorer` decorator. */\nexport function defineScorer(\n  name: string,\n  fn: (source: FieldInfo, target: FieldInfo) => ScorerResult | null,\n  weight = 1.0\n): Scorer {\n  return {\n    name,\n    weight,\n    score: fn,\n  };\n}\n","// Vendored Hungarian / Kuhn-Munkres optimal assignment.\n//\n// We MINIMIZE a cost matrix. Callers that have a score matrix (higher = better)\n// should pass cost = 1 - score, matching the Python infermap convention.\n//\n// Supports rectangular matrices by padding with a large cost. The returned\n// assignment drops any rows/cols whose match touches a padded slot.\n//\n// Complexity: O(n^3) where n = max(rows, cols).\n//\n// Deterministic tie-breaking: the algorithm iterates rows/cols in index order,\n// so when multiple optimal assignments exist the lexicographically smallest\n// (by (row, col)) is preferred. The Python side rounds scores before assignment\n// to increase the chance of matching scipy's choice on fixtures.\n\nexport interface AssignmentPair {\n  row: number;\n  col: number;\n  cost: number;\n}\n\n/**\n * Solve the rectangular linear sum assignment problem.\n * Returns one pair per min(rows, cols), minimizing total cost.\n */\nexport function linearSumAssignment(costMatrix: number[][]): AssignmentPair[] {\n  const rows = costMatrix.length;\n  if (rows === 0) return [];\n  const cols = costMatrix[0]!.length;\n  if (cols === 0) return [];\n\n  const n = Math.max(rows, cols);\n  // Big-M must dominate any real assignment (so padded slots are only taken\n  // when forced by the rectangular shape) but stay small enough to preserve\n  // double precision during potential updates. 1e18 is too large: 1e18 + 10\n  // rounds back to 1e18 and breaks the algorithm. Compute from input scale.\n  let maxAbs = 0;\n  for (let i = 0; i < rows; i++) {\n    const row = costMatrix[i]!;\n    for (let j = 0; j < cols; j++) {\n      const v = row[j]!;\n      if (Number.isFinite(v)) {\n        const a = Math.abs(v);\n        if (a > maxAbs) maxAbs = a;\n      }\n    }\n  }\n  const INF = (maxAbs + 1) * (n + 1) * 4 + 1;\n\n  const c: number[][] = Array.from({ length: n }, (_, i) =>\n    Array.from({ length: n }, (_, j) => {\n      if (i < rows && j < cols) {\n        const row = costMatrix[i]!;\n        const v = row[j]!;\n        return Number.isFinite(v) ? v : INF;\n      }\n      return INF;\n    })\n  );\n\n  // Standard O(n^3) Hungarian with potentials (Kuhn-Munkres, \"Jonker-Volgenant-lite\").\n  // Reference: competitive-programming handbooks; this is the shortest-path variant.\n  const u = new Array<number>(n + 1).fill(0);\n  const v = new Array<number>(n + 1).fill(0);\n  const p = new Array<number>(n + 1).fill(0); // p[j] = row assigned to col j (1-indexed)\n  const way = new Array<number>(n + 1).fill(0);\n\n  for (let i = 1; i <= n; i++) {\n    p[0] = i;\n    let j0 = 0;\n    const minv = new Array<number>(n + 1).fill(Infinity);\n    const used = new Array<boolean>(n + 1).fill(false);\n    do {\n      used[j0] = true;\n      const i0 = p[j0]!;\n      let delta = Infinity;\n      let j1 = 0;\n      for (let j = 1; j <= n; j++) {\n        if (!used[j]) {\n          const cur = c[i0 - 1]![j - 1]! - u[i0]! - v[j]!;\n          if (cur < minv[j]!) {\n            minv[j] = cur;\n            way[j] = j0;\n          }\n          if (minv[j]! < delta) {\n            delta = minv[j]!;\n            j1 = j;\n          }\n        }\n      }\n      for (let j = 0; j <= n; j++) {\n        if (used[j]) {\n          u[p[j]!] = u[p[j]!]! + delta;\n          v[j] = v[j]! - delta;\n        } else {\n          minv[j] = minv[j]! - delta;\n        }\n      }\n      j0 = j1;\n    } while (p[j0] !== 0);\n    do {\n      const j1 = way[j0]!;\n      p[j0] = p[j1]!;\n      j0 = j1;\n    } while (j0 !== 0);\n  }\n\n  // p[j] = row assigned to col j (1-indexed, 0 = dummy)\n  const pairs: AssignmentPair[] = [];\n  for (let j = 1; j <= n; j++) {\n    const i = p[j]! - 1;\n    const jj = j - 1;\n    if (i >= 0 && i < rows && jj < cols) {\n      const cost = costMatrix[i]![jj]!;\n      if (Number.isFinite(cost)) {\n        pairs.push({ row: i, col: jj, cost });\n      }\n    }\n  }\n  pairs.sort((a, b) => a.row - b.row || a.col - b.col);\n  return pairs;\n}\n\n/**\n * Convenience: optimal assignment on a score matrix (higher = better),\n * matching Python infermap.assignment.optimal_assign. Filters by min_confidence\n * and rounds scores to 4 decimal places for parity with scipy output.\n */\nexport interface ScoreAssignment {\n  sourceIdx: number;\n  targetIdx: number;\n  score: number;\n}\n\nexport function optimalAssign(\n  scoreMatrix: number[][],\n  minConfidence = 0.2\n): ScoreAssignment[] {\n  if (scoreMatrix.length === 0) return [];\n  const cols = scoreMatrix[0]?.length ?? 0;\n  if (cols === 0) return [];\n\n  const costMatrix = scoreMatrix.map((row) => row.map((s) => 1 - s));\n  const pairs = linearSumAssignment(costMatrix);\n  const out: ScoreAssignment[] = [];\n  for (const { row, col } of pairs) {\n    const score = scoreMatrix[row]![col]!;\n    if (score >= minConfidence) {\n      out.push({\n        sourceIdx: row,\n        targetIdx: col,\n        score: Math.round(score * 10000) / 10000,\n      });\n    }\n  }\n  return out;\n}\n","// Healthcare domain dictionary. Mirrors infermap/dictionaries/healthcare.yaml.\nexport const DOMAIN: Record<string, readonly string[]> = {\n  patient_id: [\n    \"mrn\",\n    \"medical_record_number\",\n    \"patient_identifier\",\n    \"pat_id\",\n    \"ptid\",\n    \"subject_id\",\n    \"person_id\",\n  ],\n  encounter_id: [\n    \"visit_id\",\n    \"admission_id\",\n    \"encounter_num\",\n    \"enc_id\",\n    \"visit_num\",\n    \"admit_id\",\n  ],\n  date_of_birth: [\"dob\", \"birth_date\", \"birthdate\", \"date_birth\", \"pat_dob\"],\n  admission_date: [\n    \"admit_date\",\n    \"admit_dt\",\n    \"date_admitted\",\n    \"enc_start_date\",\n    \"encounter_start\",\n  ],\n  discharge_date: [\n    \"discharge_dt\",\n    \"date_discharged\",\n    \"dischrg_date\",\n    \"enc_end_date\",\n    \"encounter_end\",\n  ],\n  diagnosis_code: [\n    \"dx_code\",\n    \"icd_code\",\n    \"icd10_code\",\n    \"diagnosis\",\n    \"dx\",\n    \"primary_dx\",\n    \"condition_code\",\n  ],\n  procedure_code: [\"cpt_code\", \"proc_code\", \"hcpcs_code\", \"procedure\", \"proc\"],\n  medication_name: [\"med_name\", \"drug_name\", \"rx_name\", \"medication\", \"drug\"],\n  medication_code: [\"ndc\", \"rxnorm\", \"rxcui\", \"drug_code\", \"med_code\"],\n  allergy: [\"allergen\", \"allergic_to\", \"adverse_reaction\"],\n  provider_id: [\n    \"npi\",\n    \"doctor_id\",\n    \"physician_id\",\n    \"prescriber_id\",\n    \"practitioner_id\",\n    \"rendering_provider\",\n  ],\n  payer: [\"insurance\", \"insurer\", \"health_plan\", \"plan_name\", \"carrier\"],\n  loinc_code: [\"lab_code\", \"test_code\", \"observation_code\"],\n  observation_value: [\n    \"lab_value\",\n    \"result_value\",\n    \"test_result\",\n    \"obs_value\",\n    \"value_num\",\n  ],\n  observation_unit: [\"units\", \"unit_of_measure\", \"uom\", \"result_units\"],\n  gender: [\"sex\", \"patient_gender\", \"gender_code\"],\n  ethnicity: [\"ethnic_group\", \"ethnicity_code\"],\n  race: [\"race_code\", \"racial_group\"],\n};\n","// Finance domain dictionary. Mirrors infermap/dictionaries/finance.yaml.\nexport const DOMAIN: Record<string, readonly string[]> = {\n  account_id: [\n    \"acct_id\",\n    \"account_number\",\n    \"acct_num\",\n    \"acct_no\",\n    \"iban\",\n    \"account_ref\",\n  ],\n  account_name: [\n    \"acct_name\",\n    \"holder_name\",\n    \"account_holder\",\n    \"acct_owner\",\n    \"beneficiary_name\",\n  ],\n  amount: [\n    \"amt\",\n    \"txn_amount\",\n    \"transaction_amount\",\n    \"value_amt\",\n    \"instructed_amount\",\n    \"settlement_amount\",\n  ],\n  currency: [\"ccy\", \"currency_code\", \"iso_currency\", \"curr\", \"currency_iso\"],\n  transaction_id: [\n    \"txn_id\",\n    \"tx_id\",\n    \"transaction_ref\",\n    \"payment_id\",\n    \"end_to_end_id\",\n    \"instr_id\",\n  ],\n  transaction_date: [\n    \"txn_date\",\n    \"trade_date\",\n    \"value_date\",\n    \"booking_date\",\n    \"posting_date\",\n    \"effective_date\",\n  ],\n  settlement_date: [\"settle_date\", \"settlement_dt\", \"value_date\", \"val_dt\"],\n  debit: [\"dr\", \"debit_amt\", \"debit_amount\", \"db\"],\n  credit: [\"cr\", \"credit_amt\", \"credit_amount\"],\n  balance: [\n    \"bal\",\n    \"current_balance\",\n    \"avail_balance\",\n    \"available_balance\",\n    \"closing_balance\",\n  ],\n  counterparty: [\n    \"cpty\",\n    \"counter_party\",\n    \"other_party\",\n    \"cpty_name\",\n    \"beneficiary\",\n  ],\n  counterparty_id: [\"cpty_id\", \"counterparty_ref\", \"bic\", \"swift_code\"],\n  instrument: [\"instr\", \"security\", \"asset\", \"product\"],\n  isin: [\"security_id\", \"instrument_id\", \"isin_code\"],\n  cusip: [\"cusip_id\", \"security_cusip\"],\n  ticker: [\"symbol\", \"ticker_symbol\", \"trading_symbol\", \"stock_symbol\"],\n  quantity: [\"qty\", \"shares\", \"units\", \"nominal\", \"face_value\"],\n  price: [\"px\", \"unit_price\", \"trade_price\", \"market_price\", \"quoted_price\"],\n  fee: [\"commission\", \"charges\", \"fees\", \"fee_amt\", \"commission_amt\"],\n  tax: [\"tax_amt\", \"vat\", \"sales_tax\", \"withholding_tax\"],\n  interest_rate: [\"int_rate\", \"rate\", \"coupon\", \"coupon_rate\", \"apr\", \"apy\"],\n  ledger_entry_id: [\"gl_entry_id\", \"journal_id\", \"posting_id\", \"entry_ref\"],\n  gl_account: [\"gl_code\", \"gl_acct\", \"account_code\", \"chart_of_accounts\"],\n};\n","// E-commerce domain dictionary. Mirrors infermap/dictionaries/ecommerce.yaml.\nexport const DOMAIN: Record<string, readonly string[]> = {\n  product_id: [\n    \"sku\",\n    \"product_code\",\n    \"prod_id\",\n    \"item_id\",\n    \"item_code\",\n    \"catalog_number\",\n  ],\n  product_name: [\n    \"item_name\",\n    \"prod_name\",\n    \"title\",\n    \"product_title\",\n    \"item_title\",\n  ],\n  product_description: [\n    \"description\",\n    \"desc\",\n    \"prod_desc\",\n    \"item_desc\",\n    \"long_description\",\n  ],\n  brand: [\"manufacturer\", \"make\", \"brand_name\", \"vendor\"],\n  category: [\"product_category\", \"category_name\", \"dept\", \"department\"],\n  price: [\n    \"unit_price\",\n    \"list_price\",\n    \"retail_price\",\n    \"msrp\",\n    \"sale_price\",\n    \"selling_price\",\n  ],\n  cost: [\"unit_cost\", \"wholesale_cost\", \"cost_price\", \"cogs\", \"landed_cost\"],\n  quantity: [\n    \"qty\",\n    \"quantity_ordered\",\n    \"qty_ordered\",\n    \"units\",\n    \"order_qty\",\n  ],\n  inventory: [\n    \"stock\",\n    \"on_hand\",\n    \"qty_on_hand\",\n    \"stock_level\",\n    \"available_qty\",\n    \"inventory_count\",\n  ],\n  order_id: [\n    \"order_number\",\n    \"order_num\",\n    \"order_no\",\n    \"order_ref\",\n    \"po_number\",\n    \"purchase_order\",\n  ],\n  order_date: [\n    \"ordered_at\",\n    \"order_placed\",\n    \"order_created\",\n    \"purchased_at\",\n    \"purchase_date\",\n  ],\n  order_status: [\"status\", \"fulfillment_status\", \"order_state\"],\n  customer_id: [\"cust_id\", \"buyer_id\", \"shopper_id\", \"account_id\", \"user_id\"],\n  customer_email: [\"buyer_email\", \"shopper_email\", \"contact_email\"],\n  shipping_address: [\n    \"ship_to\",\n    \"ship_addr\",\n    \"delivery_address\",\n    \"shipping_addr\",\n  ],\n  billing_address: [\"bill_to\", \"bill_addr\", \"billing_addr\", \"invoice_address\"],\n  shipping_method: [\n    \"ship_method\",\n    \"delivery_method\",\n    \"carrier\",\n    \"shipping_carrier\",\n  ],\n  tracking_number: [\"tracking_num\", \"tracking_id\", \"awb\", \"shipment_id\"],\n  payment_method: [\"pay_method\", \"payment_type\", \"tender_type\"],\n  discount: [\n    \"discount_amt\",\n    \"discount_amount\",\n    \"promo_amt\",\n    \"coupon_amount\",\n    \"markdown\",\n  ],\n  discount_code: [\"promo_code\", \"coupon_code\", \"voucher_code\"],\n  subtotal: [\"sub_total\", \"merchandise_total\", \"items_total\"],\n  total: [\"grand_total\", \"order_total\", \"total_amount\", \"final_amount\"],\n  tax_amount: [\"tax\", \"sales_tax\", \"vat\", \"tax_total\"],\n  shipping_cost: [\"shipping_fee\", \"ship_cost\", \"delivery_fee\", \"freight\"],\n};\n","// Domain alias dictionaries. Mirrors infermap/dictionaries/__init__.py.\n//\n// Each domain is a Record<canonical, aliases[]>. Load via `loadDomain(name)`\n// or combine multiple with `mergeDomains(names)`.\n\nimport { DOMAIN as GENERIC } from \"./generic.js\";\nimport { DOMAIN as HEALTHCARE } from \"./healthcare.js\";\nimport { DOMAIN as FINANCE } from \"./finance.js\";\nimport { DOMAIN as ECOMMERCE } from \"./ecommerce.js\";\n\nexport class UnknownDomainError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"UnknownDomainError\";\n  }\n}\n\nconst DOMAINS: Record<string, Record<string, readonly string[]>> = {\n  generic: GENERIC,\n  healthcare: HEALTHCARE,\n  finance: FINANCE,\n  ecommerce: ECOMMERCE,\n};\n\nexport function availableDomains(): string[] {\n  return Object.keys(DOMAINS).sort();\n}\n\nexport function loadDomain(name: string): Record<string, string[]> {\n  const d = DOMAINS[name];\n  if (!d) {\n    throw new UnknownDomainError(\n      `Unknown domain '${name}'. Available: ${JSON.stringify(availableDomains())}`\n    );\n  }\n  // Copy into a mutable structure.\n  const out: Record<string, string[]> = {};\n  for (const [canonical, aliases] of Object.entries(d)) {\n    out[canonical] = aliases.slice();\n  }\n  return out;\n}\n\nexport function mergeDomains(names: readonly string[]): Record<string, string[]> {\n  const merged: Record<string, string[]> = {};\n  for (const name of names) {\n    const domain = loadDomain(name);\n    for (const [canonical, aliases] of Object.entries(domain)) {\n      if (!merged[canonical]) {\n        merged[canonical] = aliases.slice();\n      } else {\n        const existing = merged[canonical]!;\n        for (const a of aliases) {\n          if (!existing.includes(a)) existing.push(a);\n        }\n      }\n    }\n  }\n  return merged;\n}\n","// MapEngine — orchestrates scoring and assignment on pre-extracted schemas.\n// Mirrors infermap/engine.py. Provider-based schema extraction lives in\n// src/core/providers (Step 11); this module operates on SchemaInfo directly\n// so core is edge-safe and free of Node-only deps.\n\nimport type {\n  FieldInfo,\n  FieldMapping,\n  MapResult,\n  ScorerResult,\n  SchemaInfo,\n} from \"./types.js\";\nimport type { Scorer } from \"./scorers/base.js\";\nimport { defaultScorers } from \"./scorers/registry.js\";\nimport { AliasScorer } from \"./scorers/alias.js\";\nimport { optimalAssign } from \"./assignment/hungarian.js\";\nimport type { Calibrator } from \"./calibration.js\";\nimport { mergeDomains } from \"./dictionaries/index.js\";\n\n// Minimum number of non-abstain scorer contributors required to keep a score.\nexport const MIN_CONTRIBUTORS = 2;\n\nconst DELIMITERS = new Set([\"_\", \"-\", \".\", \" \"]);\n\n/**\n * Find a common delimiter-bounded affix across *names*, else \"\".\n * Mirrors Python engine._common_affix_tokens.\n */\nexport function commonAffixTokens(\n  names: readonly string[],\n  atStart: boolean\n): string {\n  if (names.length < 2) return \"\";\n  const shortest = names.map((n) => n.length).reduce((m, v) => (v < m ? v : m), Infinity);\n  let i = 0;\n  if (atStart) {\n    while (i < shortest && names.every((n) => n[i] === names[0]![i])) i++;\n  } else {\n    while (\n      i < shortest &&\n      names.every((n) => n[n.length - 1 - i] === names[0]![names[0]!.length - 1 - i])\n    )\n      i++;\n  }\n  const candidate = atStart\n    ? names[0]!.slice(0, i)\n    : i > 0\n      ? names[0]!.slice(names[0]!.length - i)\n      : \"\";\n  if (candidate.length < 2) return \"\";\n  if (atStart) {\n    for (let pos = candidate.length - 1; pos >= 0; pos--) {\n      if (DELIMITERS.has(candidate[pos]!)) return candidate.slice(0, pos + 1);\n    }\n    return \"\";\n  } else {\n    for (let pos = 0; pos < candidate.length; pos++) {\n      if (DELIMITERS.has(candidate[pos]!)) return candidate.slice(pos);\n    }\n    return \"\";\n  }\n}\n\n/** Populate FieldInfo.canonicalName on each field. Mutates *fields*. */\nexport function populateCanonicalNames(fields: FieldInfo[]): void {\n  const names = fields.map((f) => f.name);\n  const prefix = commonAffixTokens(names, true);\n  const suffix = commonAffixTokens(names, false);\n  for (const f of fields) {\n    let canonical = f.name;\n    if (prefix && canonical.startsWith(prefix)) canonical = canonical.slice(prefix.length);\n    if (suffix && canonical.endsWith(suffix))\n      canonical = canonical.slice(0, canonical.length - suffix.length);\n    f.canonicalName = canonical || f.name;\n  }\n}\n\nfunction cloneFields(fields: readonly FieldInfo[]): FieldInfo[] {\n  return fields.map((f) => ({\n    ...f,\n    sampleValues: f.sampleValues.slice(),\n    metadata: { ...f.metadata },\n  }));\n}\n\nfunction defaultScorersWithDomains(domains: readonly string[]): Scorer[] {\n  const ordered: string[] = [];\n  if (!domains.includes(\"generic\")) ordered.push(\"generic\");\n  ordered.push(...domains);\n  const merged = mergeDomains(ordered);\n  const scorers = defaultScorers();\n  for (let i = 0; i < scorers.length; i++) {\n    if (scorers[i]!.name === \"AliasScorer\") {\n      scorers[i] = new AliasScorer({ aliases: merged });\n      break;\n    }\n  }\n  return scorers;\n}\n\nexport interface MapEngineOptions {\n  minConfidence?: number;\n  scorers?: Scorer[];\n  /** Logger callback invoked when a scorer throws. Defaults to console.warn. */\n  onScorerError?: (info: {\n    scorer: string;\n    source: string;\n    target: string;\n    error: unknown;\n  }) => void;\n  /** If true, attach the full MxN score matrix to MapResult.scoreMatrix. */\n  returnScoreMatrix?: boolean;\n  /**\n   * Optional post-assignment confidence calibrator. Applied AFTER\n   * `optimalAssign` has picked mappings, so it never changes WHICH mappings\n   * are chosen — only the confidence attached to each. min_confidence\n   * filtering happens during assignment on raw scores; calibration is about\n   * user-facing trust, not assignment behavior.\n   */\n  calibrator?: Calibrator;\n  /**\n   * Domain dictionaries to load in addition to `generic`. When set, the\n   * engine builds a per-instance AliasScorer whose alias dict merges\n   * generic + requested domains, and swaps it into the default scorer list.\n   */\n  domains?: readonly string[];\n}\n\nexport interface MapSchemasOptions {\n  /** Extra required target field names, merged with schema.requiredFields. */\n  required?: string[];\n  /** Schema-file alias source: merges its fields' metadata.aliases into target. */\n  schemaFile?: SchemaInfo;\n}\n\nexport class MapEngine {\n  readonly minConfidence: number;\n  readonly scorers: readonly Scorer[];\n  readonly returnScoreMatrix: boolean;\n  readonly calibrator: Calibrator | undefined;\n  readonly domains: readonly string[] | undefined;\n  private readonly onScorerError: NonNullable<MapEngineOptions[\"onScorerError\"]>;\n\n  constructor(options: MapEngineOptions = {}) {\n    this.minConfidence = options.minConfidence ?? 0.2;\n    this.domains = options.domains;\n    if (options.scorers) {\n      this.scorers = options.scorers;\n    } else if (options.domains) {\n      this.scorers = defaultScorersWithDomains(options.domains);\n    } else {\n      this.scorers = defaultScorers();\n    }\n    this.returnScoreMatrix = options.returnScoreMatrix ?? false;\n    this.calibrator = options.calibrator;\n    this.onScorerError =\n      options.onScorerError ??\n      (({ scorer, source, target, error }) => {\n        // eslint-disable-next-line no-console\n        console.warn(\n          `Scorer ${scorer} raised for (${source}, ${target}): ${String(error)}`\n        );\n      });\n  }\n\n  /**\n   * Core mapping path: given two pre-extracted schemas, return a MapResult.\n   * This is the edge-safe entry point — providers/extractors layer on top.\n   */\n  mapSchemas(\n    sourceSchema: SchemaInfo,\n    targetSchema: SchemaInfo,\n    opts: MapSchemasOptions = {}\n  ): MapResult {\n    const t0 = performance.now();\n\n    // Deep-copy both sides so we can populate canonicalName + mutate metadata\n    // without leaking into the caller's schemas.\n    const srcFields = cloneFields(sourceSchema.fields);\n    const tgtFields = cloneFields(targetSchema.fields);\n\n    // Merge required fields: target schema + caller-supplied + schema_file\n    const requiredSet = new Set<string>(targetSchema.requiredFields);\n    for (const r of opts.required ?? []) requiredSet.add(r);\n\n    if (opts.schemaFile) {\n      const sfByName = new Map<string, FieldInfo>();\n      for (const f of opts.schemaFile.fields) sfByName.set(f.name, f);\n      for (const tgt of tgtFields) {\n        const sfField = sfByName.get(tgt.name);\n        if (!sfField) continue;\n        const extra = Array.isArray(sfField.metadata[\"aliases\"])\n          ? (sfField.metadata[\"aliases\"] as unknown[]).filter(\n              (x): x is string => typeof x === \"string\"\n            )\n          : [];\n        const existing = Array.isArray(tgt.metadata[\"aliases\"])\n          ? (tgt.metadata[\"aliases\"] as unknown[]).filter(\n              (x): x is string => typeof x === \"string\"\n            )\n          : [];\n        // Preserve order, dedupe\n        const merged = Array.from(new Set([...existing, ...extra]));\n        if (merged.length > 0) tgt.metadata[\"aliases\"] = merged;\n      }\n      for (const r of opts.schemaFile.requiredFields) requiredSet.add(r);\n    }\n\n    // Populate canonical_name on each field (affix-stripped).\n    populateCanonicalNames(srcFields);\n    populateCanonicalNames(tgtFields);\n\n    const M = srcFields.length;\n    const N = tgtFields.length;\n\n    const scoreMatrix: number[][] = Array.from({ length: M }, () =>\n      new Array<number>(N).fill(0)\n    );\n    const breakdownMatrix: Array<Array<Record<string, ScorerResult>>> =\n      Array.from({ length: M }, () =>\n        Array.from({ length: N }, () => ({}))\n      );\n\n    for (let i = 0; i < M; i++) {\n      const src = srcFields[i]!;\n      for (let j = 0; j < N; j++) {\n        const tgt = tgtFields[j]!;\n        const contributors: Array<{\n          name: string;\n          result: ScorerResult;\n          weight: number;\n        }> = [];\n\n        for (const sc of this.scorers) {\n          let result: ScorerResult | null = null;\n          try {\n            result = sc.score(src, tgt);\n          } catch (error) {\n            this.onScorerError({\n              scorer: sc.name,\n              source: src.name,\n              target: tgt.name,\n              error,\n            });\n            result = null;\n          }\n          if (result !== null) {\n            contributors.push({ name: sc.name, result, weight: sc.weight });\n          }\n        }\n\n        let combined = 0;\n        if (contributors.length >= MIN_CONTRIBUTORS) {\n          let totalWeight = 0;\n          let weightedSum = 0;\n          for (const c of contributors) {\n            totalWeight += c.weight;\n            weightedSum += c.result.score * c.weight;\n          }\n          combined = totalWeight > 0 ? weightedSum / totalWeight : 0;\n        }\n\n        scoreMatrix[i]![j] = combined;\n        const breakdown: Record<string, ScorerResult> = {};\n        for (const c of contributors) breakdown[c.name] = c.result;\n        breakdownMatrix[i]![j] = breakdown;\n      }\n    }\n\n    const assignments = optimalAssign(scoreMatrix, this.minConfidence);\n    const assignedSrc = new Set<number>();\n    const assignedTgt = new Set<number>();\n    const mappings: FieldMapping[] = [];\n\n    for (const a of assignments) {\n      assignedSrc.add(a.sourceIdx);\n      assignedTgt.add(a.targetIdx);\n      const src = srcFields[a.sourceIdx]!;\n      const tgt = tgtFields[a.targetIdx]!;\n      const bd = breakdownMatrix[a.sourceIdx]![a.targetIdx]!;\n      const reasoning = Object.entries(bd)\n        .map(([name, res]) => `${name}: ${res.reasoning}`)\n        .join(\"; \");\n      mappings.push({\n        source: src.name,\n        target: tgt.name,\n        confidence: a.score,\n        breakdown: bd,\n        reasoning,\n      });\n    }\n\n    // Post-assignment calibration. Applied to confidence only — it does not\n    // change which mappings were picked, only the score attached to each.\n    if (this.calibrator && mappings.length > 0) {\n      const raw = mappings.map((m) => m.confidence);\n      const cal = this.calibrator.transform(raw);\n      if (cal.length !== mappings.length) {\n        throw new Error(\n          `Calibrator.transform() returned ${cal.length} values for ${mappings.length} mappings`\n        );\n      }\n      for (let i = 0; i < mappings.length; i++) {\n        const c = cal[i]!;\n        if (!Number.isFinite(c)) {\n          throw new Error(\n            `Calibrator.transform() returned non-finite value ${c} at index ${i}`\n          );\n        }\n        mappings[i]!.confidence = c;\n      }\n    }\n\n    const unmappedSource: string[] = [];\n    for (let i = 0; i < M; i++)\n      if (!assignedSrc.has(i)) unmappedSource.push(srcFields[i]!.name);\n    const unmappedTarget: string[] = [];\n    for (let j = 0; j < N; j++)\n      if (!assignedTgt.has(j)) unmappedTarget.push(tgtFields[j]!.name);\n\n    // Warnings for unmapped required target fields\n    const warnings: string[] = [];\n    const mappedTargets = new Set(mappings.map((m) => m.target));\n    for (const reqField of requiredSet) {\n      if (mappedTargets.has(reqField)) continue;\n      const tgtIdx = tgtFields.findIndex((tf) => tf.name === reqField);\n      let bestCandidate: string | null = null;\n      let bestScore = 0;\n      if (tgtIdx >= 0) {\n        for (let i = 0; i < M; i++) {\n          const s = scoreMatrix[i]![tgtIdx]!;\n          if (s > bestScore) {\n            bestScore = s;\n            bestCandidate = srcFields[i]!.name;\n          }\n        }\n      }\n      if (bestCandidate) {\n        warnings.push(\n          `Required target field '${reqField}' is unmapped. Best candidate: '${bestCandidate}' (score=${bestScore.toFixed(3)})`\n        );\n      } else {\n        warnings.push(\n          `Required target field '${reqField}' is unmapped and no candidate found.`\n        );\n      }\n    }\n\n    // Optional: expose the full score matrix for MRR computation in the benchmark.\n    let scoreMatrixDict: Record<string, Record<string, number>> | undefined;\n    if (this.returnScoreMatrix) {\n      scoreMatrixDict = {};\n      for (let i = 0; i < M; i++) {\n        const row: Record<string, number> = {};\n        for (let j = 0; j < N; j++) {\n          row[tgtFields[j]!.name] = scoreMatrix[i]![j]!;\n        }\n        scoreMatrixDict[srcFields[i]!.name] = row;\n      }\n    }\n\n    const elapsed = (performance.now() - t0) / 1000;\n    return {\n      mappings,\n      unmappedSource,\n      unmappedTarget,\n      warnings,\n      metadata: {\n        elapsed_seconds: Math.round(elapsed * 10000) / 10000,\n        source_field_count: M,\n        target_field_count: N,\n        mapping_count: mappings.length,\n        min_confidence: this.minConfidence,\n      },\n      ...(scoreMatrixDict !== undefined ? { scoreMatrix: scoreMatrixDict } : {}),\n    };\n  }\n}\n","// JSON config loading + saved MapResult round-trip.\n// Mirrors infermap/config.py but JSON-only (no YAML).\n//\n// Two distinct config shapes live here:\n//\n//   1. Engine config — scorer weight overrides + alias extensions.\n//      Shape: { scorers?: { [name]: { enabled?, weight? } }, aliases?: { [canonical]: string[] } }\n//      Consumed by `loadEngineConfig` and passed to MapEngine.\n//\n//   2. Saved MapResult config — a previously-computed mapping serialized to disk.\n//      Shape: { version, mappings: [{source, target, confidence}], unmapped_source, unmapped_target }\n//      Loaded by `fromConfig`, written by `mapResultToConfigJson`.\n\nimport type {\n  FieldMapping,\n  MapResult,\n  Scorer,\n} from \"./index.js\";\n\n// ---------- engine config ----------\n\nexport interface ScorerOverride {\n  enabled?: boolean;\n  weight?: number;\n}\n\nexport interface EngineConfig {\n  scorers?: Record<string, ScorerOverride>;\n  aliases?: Record<string, string[]>;\n}\n\nexport class ConfigError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"ConfigError\";\n  }\n}\n\n/** Parse + validate engine config JSON. Returns a normalized EngineConfig. */\nexport function loadEngineConfig(json: string | EngineConfig): EngineConfig {\n  const raw: unknown = typeof json === \"string\" ? JSON.parse(json) : json;\n  if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) {\n    throw new ConfigError(\"Engine config must be an object\");\n  }\n  const cfg = raw as Record<string, unknown>;\n  const out: EngineConfig = {};\n\n  if (cfg[\"scorers\"] !== undefined) {\n    if (typeof cfg[\"scorers\"] !== \"object\" || cfg[\"scorers\"] === null) {\n      throw new ConfigError(\"'scorers' must be an object\");\n    }\n    const scorers: Record<string, ScorerOverride> = {};\n    for (const [name, override] of Object.entries(cfg[\"scorers\"])) {\n      if (typeof override !== \"object\" || override === null) {\n        throw new ConfigError(`Scorer override for '${name}' must be an object`);\n      }\n      const o = override as Record<string, unknown>;\n      const entry: ScorerOverride = {};\n      if (typeof o[\"enabled\"] === \"boolean\") entry.enabled = o[\"enabled\"];\n      if (typeof o[\"weight\"] === \"number\") entry.weight = o[\"weight\"];\n      scorers[name] = entry;\n    }\n    out.scorers = scorers;\n  }\n\n  if (cfg[\"aliases\"] !== undefined) {\n    if (typeof cfg[\"aliases\"] !== \"object\" || cfg[\"aliases\"] === null) {\n      throw new ConfigError(\"'aliases' must be an object\");\n    }\n    const aliases: Record<string, string[]> = {};\n    for (const [canonical, list] of Object.entries(cfg[\"aliases\"])) {\n      if (!Array.isArray(list)) {\n        throw new ConfigError(\n          `Aliases for '${canonical}' must be an array of strings`\n        );\n      }\n      aliases[canonical] = list.filter((x): x is string => typeof x === \"string\");\n    }\n    out.aliases = aliases;\n  }\n\n  return out;\n}\n\n/**\n * Apply scorer overrides (enable/disable + reweight) to a scorer list.\n * Returns a new array; original is untouched. Disabled scorers are dropped.\n */\nexport function applyScorerOverrides(\n  scorers: readonly Scorer[],\n  overrides: Record<string, ScorerOverride> | undefined\n): Scorer[] {\n  if (!overrides) return [...scorers];\n  const out: Scorer[] = [];\n  for (const sc of scorers) {\n    const override = overrides[sc.name];\n    if (!override) {\n      out.push(sc);\n      continue;\n    }\n    if (override.enabled === false) continue;\n    if (override.weight !== undefined) {\n      // Wrap with a new object exposing the overridden weight so we don't\n      // mutate shared scorer instances.\n      out.push({\n        name: sc.name,\n        weight: override.weight,\n        score: sc.score.bind(sc),\n      });\n    } else {\n      out.push(sc);\n    }\n  }\n  return out;\n}\n\n// ---------- saved MapResult config ----------\n\nexport interface MapResultConfig {\n  version: string;\n  mappings: Array<{ source: string; target: string; confidence: number }>;\n  unmapped_source?: string[];\n  unmapped_target?: string[];\n}\n\n/**\n * Reconstruct a MapResult from a saved config JSON.\n * The resulting MapResult has empty breakdowns and reasoning (not serialized).\n */\nexport function fromConfig(json: string | MapResultConfig): MapResult {\n  const raw: unknown = typeof json === \"string\" ? JSON.parse(json) : json;\n  if (raw === null || typeof raw !== \"object\" || !(\"mappings\" in raw)) {\n    throw new ConfigError(\"Config is missing required 'mappings' key\");\n  }\n  const data = raw as Record<string, unknown>;\n  if (!Array.isArray(data[\"mappings\"])) {\n    throw new ConfigError(\"'mappings' must be a list\");\n  }\n\n  const mappings: FieldMapping[] = [];\n  for (const entry of data[\"mappings\"]) {\n    if (entry === null || typeof entry !== \"object\") {\n      throw new ConfigError(\"Each mapping entry must be an object\");\n    }\n    const e = entry as Record<string, unknown>;\n    mappings.push({\n      source: typeof e[\"source\"] === \"string\" ? e[\"source\"] : \"\",\n      target: typeof e[\"target\"] === \"string\" ? e[\"target\"] : \"\",\n      confidence: typeof e[\"confidence\"] === \"number\" ? e[\"confidence\"] : 0,\n      breakdown: {},\n      reasoning: \"\",\n    });\n  }\n\n  const unmappedSource = Array.isArray(data[\"unmapped_source\"])\n    ? (data[\"unmapped_source\"] as unknown[]).filter(\n        (x): x is string => typeof x === \"string\"\n      )\n    : [];\n  const unmappedTarget = Array.isArray(data[\"unmapped_target\"])\n    ? (data[\"unmapped_target\"] as unknown[]).filter(\n        (x): x is string => typeof x === \"string\"\n      )\n    : [];\n\n  return {\n    mappings,\n    unmappedSource,\n    unmappedTarget,\n    warnings: [],\n    metadata: {\n      version: typeof data[\"version\"] === \"string\" ? data[\"version\"] : \"\",\n    },\n  };\n}\n\n/** Serialize a MapResult to the saved-config JSON shape. */\nexport function mapResultToConfigJson(result: MapResult): string {\n  const round = (n: number): number => Math.round(n * 1000) / 1000;\n  const data: MapResultConfig = {\n    version: \"1\",\n    mappings: result.mappings.map((m) => ({\n      source: m.source,\n      target: m.target,\n      confidence: round(m.confidence),\n    })),\n    unmapped_source: result.unmappedSource,\n    unmapped_target: result.unmappedTarget,\n  };\n  return JSON.stringify(data, null, 2);\n}\n","// Minimal RFC 4180 CSV parser. Edge-safe (no Node built-ins).\n//\n// Supports:\n//   - Header row (always required)\n//   - Quoted fields with embedded commas, newlines, and \"\" escapes\n//   - CRLF, LF, and CR line endings\n//   - Trailing newline tolerance\n//\n// Does NOT support:\n//   - Custom delimiters (comma only)\n//   - Comment lines\n//   - Skipping rows\n//\n// If we need more, we'll revisit. The Python side uses polars CSV reader;\n// parity tests cover fixture-based compatibility.\n\nexport interface CsvParseResult {\n  headers: string[];\n  rows: Record<string, string>[];\n}\n\nexport function parseCsv(text: string): CsvParseResult {\n  // Strip UTF-8 BOM if present\n  if (text.charCodeAt(0) === 0xfeff) text = text.slice(1);\n\n  const records: string[][] = [];\n  let row: string[] = [];\n  let field = \"\";\n  let inQuotes = false;\n  let i = 0;\n  const n = text.length;\n\n  while (i < n) {\n    const ch = text[i]!;\n\n    if (inQuotes) {\n      if (ch === '\"') {\n        if (i + 1 < n && text[i + 1] === '\"') {\n          field += '\"';\n          i += 2;\n          continue;\n        }\n        inQuotes = false;\n        i++;\n        continue;\n      }\n      field += ch;\n      i++;\n      continue;\n    }\n\n    if (ch === '\"') {\n      inQuotes = true;\n      i++;\n      continue;\n    }\n    if (ch === \",\") {\n      row.push(field);\n      field = \"\";\n      i++;\n      continue;\n    }\n    if (ch === \"\\r\") {\n      // Handle CRLF as single line ending\n      row.push(field);\n      field = \"\";\n      records.push(row);\n      row = [];\n      i++;\n      if (i < n && text[i] === \"\\n\") i++;\n      continue;\n    }\n    if (ch === \"\\n\") {\n      row.push(field);\n      field = \"\";\n      records.push(row);\n      row = [];\n      i++;\n      continue;\n    }\n    field += ch;\n    i++;\n  }\n\n  // Flush final field/row if not empty\n  if (field.length > 0 || row.length > 0) {\n    row.push(field);\n    records.push(row);\n  }\n\n  // Drop trailing empty row (from trailing newline)\n  if (\n    records.length > 0 &&\n    records[records.length - 1]!.length === 1 &&\n    records[records.length - 1]![0] === \"\"\n  ) {\n    records.pop();\n  }\n\n  if (records.length === 0) return { headers: [], rows: [] };\n\n  const headers = records[0]!;\n  const rows: Record<string, string>[] = [];\n  for (let r = 1; r < records.length; r++) {\n    const record = records[r]!;\n    const obj: Record<string, string> = {};\n    for (let c = 0; c < headers.length; c++) {\n      obj[headers[c]!] = record[c] ?? \"\";\n    }\n    rows.push(obj);\n  }\n  return { headers, rows };\n}\n","// Column profiling + dtype inference. Pure functions, edge-safe.\n//\n// These replicate the Python provider profiling logic:\n//   null_rate    = nulls / total\n//   unique_rate  = unique non-null / total\n//   value_count  = total\n//   sample_values = first N non-null values as strings\n//\n// Python uses Polars dtype introspection. We infer dtype from sample values\n// using a conservative heuristic matching Polars' normalized dtype set.\nimport type { Dtype, FieldInfo } from \"../types.js\";\nimport { makeFieldInfo } from \"../types.js\";\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATETIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+\\-]\\d{2}:?\\d{2})?$/;\nconst BOOLEAN_VALUES = new Set([\"true\", \"false\", \"True\", \"False\", \"TRUE\", \"FALSE\", \"0\", \"1\"]);\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\n\nexport function isNullLike(value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  if (typeof value === \"string\") {\n    const t = value.trim();\n    return t === \"\" || t.toLowerCase() === \"null\" || t.toLowerCase() === \"nan\";\n  }\n  return false;\n}\n\nexport function inferDtype(values: readonly unknown[]): Dtype {\n  const sample = values.filter((v) => !isNullLike(v));\n  if (sample.length === 0) return \"string\";\n\n  // Check each row with all heuristics; whichever matches every row wins.\n  let allBool = true;\n  let allInt = true;\n  let allFloat = true;\n  let allDate = true;\n  let allDatetime = true;\n\n  for (const v of sample) {\n    // Native types first\n    if (typeof v === \"boolean\") {\n      allInt = false;\n      allFloat = false;\n      allDate = false;\n      allDatetime = false;\n      continue;\n    }\n    if (typeof v === \"number\") {\n      allBool = false;\n      allDate = false;\n      allDatetime = false;\n      if (!Number.isInteger(v)) allInt = false;\n      continue;\n    }\n\n    const s = typeof v === \"string\" ? v.trim() : String(v).trim();\n    if (!BOOLEAN_VALUES.has(s)) allBool = false;\n    if (!INT_RE.test(s)) allInt = false;\n    if (!INT_RE.test(s) && !FLOAT_RE.test(s)) allFloat = false;\n    if (!ISO_DATE.test(s)) allDate = false;\n    if (!ISO_DATETIME.test(s)) allDatetime = false;\n  }\n\n  // Order of preference: boolean → integer → float → date → datetime → string.\n  // Booleans first so \"0\"/\"1\" don't get caught as ints.\n  if (allBool && sample.length > 0) {\n    // Only count as boolean if we saw at least one true/false (not just 0/1)\n    const hasTrueFalse = sample.some((v) => {\n      const s = typeof v === \"string\" ? v.trim().toLowerCase() : String(v).toLowerCase();\n      return s === \"true\" || s === \"false\";\n    });\n    if (hasTrueFalse || sample.every((v) => typeof v === \"boolean\")) return \"boolean\";\n  }\n  if (allInt) return \"integer\";\n  if (allFloat) return \"float\";\n  if (allDate) return \"date\";\n  if (allDatetime) return \"datetime\";\n  return \"string\";\n}\n\nexport interface ProfileStats {\n  nullRate: number;\n  uniqueRate: number;\n  valueCount: number;\n  sampleValues: string[];\n}\n\nexport function profileColumn(\n  values: readonly unknown[],\n  sampleSize = 500\n): ProfileStats {\n  const total = values.length;\n  if (total === 0) {\n    return { nullRate: 0, uniqueRate: 0, valueCount: 0, sampleValues: [] };\n  }\n\n  let nulls = 0;\n  const nonNull: unknown[] = [];\n  for (const v of values) {\n    if (isNullLike(v)) {\n      nulls++;\n    } else {\n      nonNull.push(v);\n    }\n  }\n\n  const uniqueSet = new Set<string>();\n  for (const v of nonNull) uniqueSet.add(String(v));\n\n  const sampleValues = nonNull\n    .slice(0, sampleSize)\n    .map((v) => (typeof v === \"string\" ? v : String(v)));\n\n  return {\n    nullRate: nulls / total,\n    uniqueRate: uniqueSet.size / total,\n    valueCount: total,\n    sampleValues,\n  };\n}\n\nexport function profileFieldFromValues(\n  name: string,\n  values: readonly unknown[],\n  sampleSize = 500\n): FieldInfo {\n  const stats = profileColumn(values, sampleSize);\n  return makeFieldInfo({\n    name,\n    dtype: inferDtype(values),\n    sampleValues: stats.sampleValues,\n    nullRate: stats.nullRate,\n    uniqueRate: stats.uniqueRate,\n    valueCount: stats.valueCount,\n  });\n}\n","// InMemoryProvider — infer schema from an array of plain records.\n// Mirrors infermap/providers/memory.py but narrowed to the edge-safe JS case:\n// we don't carry a Polars/Pandas equivalent, just JSON-shaped data.\nimport type { SchemaInfo, FieldInfo } from \"../types.js\";\nimport { makeSchemaInfo } from \"../types.js\";\nimport { profileFieldFromValues } from \"../util/profile.js\";\n\nexport interface InMemoryOptions {\n  sourceName?: string;\n  sampleSize?: number;\n  /**\n   * Optional column order. If omitted, keys are collected from the union of\n   * the first 100 records in order of first appearance. Providing a fixed\n   * order is recommended for deterministic field ordering across runs.\n   */\n  columns?: string[];\n}\n\nexport function inferSchemaFromRecords(\n  records: readonly Record<string, unknown>[],\n  options: InMemoryOptions = {}\n): SchemaInfo {\n  const sourceName = options.sourceName ?? \"memory\";\n  const sampleSize = options.sampleSize ?? 500;\n\n  let columns = options.columns;\n  if (!columns) {\n    const seen = new Set<string>();\n    const ordered: string[] = [];\n    const scanLimit = Math.min(records.length, 100);\n    for (let i = 0; i < scanLimit; i++) {\n      for (const key of Object.keys(records[i]!)) {\n        if (!seen.has(key)) {\n          seen.add(key);\n          ordered.push(key);\n        }\n      }\n    }\n    columns = ordered;\n  }\n\n  const fields: FieldInfo[] = columns.map((col) => {\n    const values = records.map((r) => r[col]);\n    return profileFieldFromValues(col, values, sampleSize);\n  });\n\n  return makeSchemaInfo({ fields, sourceName });\n}\n\nexport class InMemoryProvider {\n  extract(\n    records: readonly Record<string, unknown>[],\n    options: InMemoryOptions = {}\n  ): SchemaInfo {\n    return inferSchemaFromRecords(records, options);\n  }\n}\n","// FileProvider (edge-safe) — infer schema from CSV or JSON *text*.\n// Node-side wrappers that read from disk live under infermap/node.\nimport type { SchemaInfo } from \"../types.js\";\nimport { parseCsv } from \"../util/csv.js\";\nimport { inferSchemaFromRecords } from \"./in-memory.js\";\n\nexport interface FileProviderOptions {\n  sourceName?: string;\n  sampleSize?: number;\n}\n\nexport function inferSchemaFromCsvText(\n  text: string,\n  options: FileProviderOptions = {}\n): SchemaInfo {\n  const { headers, rows } = parseCsv(text);\n  const inner: Parameters<typeof inferSchemaFromRecords>[1] = {\n    sourceName: options.sourceName ?? \"csv\",\n    columns: headers,\n  };\n  if (options.sampleSize !== undefined) inner.sampleSize = options.sampleSize;\n  return inferSchemaFromRecords(rows, inner);\n}\n\nexport function inferSchemaFromJsonText(\n  text: string,\n  options: FileProviderOptions = {}\n): SchemaInfo {\n  const parsed = JSON.parse(text);\n  if (!Array.isArray(parsed)) {\n    throw new TypeError(\n      \"inferSchemaFromJsonText: JSON root must be an array of records\"\n    );\n  }\n  const inner: Parameters<typeof inferSchemaFromRecords>[1] = {\n    sourceName: options.sourceName ?? \"json\",\n  };\n  if (options.sampleSize !== undefined) inner.sampleSize = options.sampleSize;\n  return inferSchemaFromRecords(parsed as Record<string, unknown>[], inner);\n}\n","// SchemaFileProvider — parses a JSON schema definition file.\n// YAML is not supported in the TS port (JSON-only config decision).\n//\n// Expected shape (matches the Python YAML/JSON schema_file format):\n// {\n//   \"fields\": [\n//     { \"name\": \"customer_id\", \"dtype\": \"string\", \"aliases\": [\"cust_id\"], \"required\": true },\n//     ...\n//   ]\n// }\nimport type { FieldInfo, SchemaInfo } from \"../types.js\";\nimport { makeFieldInfo, makeSchemaInfo } from \"../types.js\";\n\ninterface SchemaFieldEntry {\n  name: string;\n  dtype?: string;\n  aliases?: string[];\n  required?: boolean;\n}\n\ninterface SchemaDefinition {\n  fields: SchemaFieldEntry[];\n}\n\nexport class SchemaParseError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"SchemaParseError\";\n  }\n}\n\nexport function parseSchemaDefinition(\n  json: string | SchemaDefinition,\n  sourceName = \"schema\"\n): SchemaInfo {\n  const raw: unknown = typeof json === \"string\" ? JSON.parse(json) : json;\n  if (!raw || typeof raw !== \"object\" || !(\"fields\" in raw)) {\n    throw new SchemaParseError(\n      \"Schema file must contain a top-level 'fields' key\"\n    );\n  }\n  const rawFields = (raw as { fields: unknown }).fields;\n  if (!Array.isArray(rawFields)) {\n    throw new SchemaParseError(\"Schema file 'fields' must be an array\");\n  }\n\n  const fields: FieldInfo[] = [];\n  const requiredFields: string[] = [];\n\n  for (const entry of rawFields as SchemaFieldEntry[]) {\n    if (!entry || typeof entry.name !== \"string\") {\n      throw new SchemaParseError(\n        \"Each field entry must be an object with a 'name' string\"\n      );\n    }\n    const aliases = Array.isArray(entry.aliases)\n      ? entry.aliases.filter((a): a is string => typeof a === \"string\")\n      : [];\n    const metadata: Record<string, unknown> = {};\n    if (aliases.length > 0) metadata[\"aliases\"] = aliases;\n\n    fields.push(\n      makeFieldInfo({\n        name: entry.name,\n        dtype: entry.dtype ?? \"string\",\n        sampleValues: [],\n        nullRate: 0,\n        uniqueRate: 0,\n        valueCount: 0,\n        metadata,\n      })\n    );\n\n    if (entry.required) requiredFields.push(entry.name);\n  }\n\n  return makeSchemaInfo({ fields, sourceName, requiredFields });\n}\n","// Node-only filesystem wrappers. Read CSV / JSON / schema-definition files\n// from disk and hand off to the edge-safe text-based providers in core.\nimport { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport {\n  inferSchemaFromCsvText,\n  inferSchemaFromJsonText,\n  type FileProviderOptions,\n} from \"../core/providers/file.js\";\nimport { parseSchemaDefinition } from \"../core/providers/schema-file.js\";\nimport type { SchemaInfo } from \"../core/types.js\";\n\nfunction stem(path: string): string {\n  const b = basename(path);\n  const ext = extname(b);\n  return ext ? b.slice(0, -ext.length) : b;\n}\n\nexport async function extractSchemaFromFile(\n  path: string,\n  options: FileProviderOptions = {}\n): Promise<SchemaInfo> {\n  const text = await readFile(path, \"utf8\");\n  const ext = extname(path).toLowerCase();\n  const sourceName = options.sourceName ?? stem(path);\n\n  if (ext === \".csv\") {\n    const opts: FileProviderOptions = { sourceName };\n    if (options.sampleSize !== undefined) opts.sampleSize = options.sampleSize;\n    return inferSchemaFromCsvText(text, opts);\n  }\n  if (ext === \".json\") {\n    // Disambiguate: JSON schema definition (has \"fields\" key) vs. array of records.\n    try {\n      const parsed = JSON.parse(text);\n      if (Array.isArray(parsed)) {\n        const opts: FileProviderOptions = { sourceName };\n        if (options.sampleSize !== undefined) opts.sampleSize = options.sampleSize;\n        return inferSchemaFromJsonText(text, opts);\n      }\n      if (parsed && typeof parsed === \"object\" && \"fields\" in parsed) {\n        return parseSchemaDefinition(text, sourceName);\n      }\n      throw new TypeError(\n        \"JSON file must be either an array of records or a schema definition with a 'fields' key\"\n      );\n    } catch (e) {\n      if (e instanceof SyntaxError) {\n        throw new SyntaxError(`Invalid JSON in ${path}: ${e.message}`);\n      }\n      throw e;\n    }\n  }\n\n  throw new Error(`Unsupported file extension for ${path}: ${ext || \"(none)\"}`);\n}\n","// DB type mapping + URI parsing. Pure functions, no driver deps.\n// Mirrors the helpers in infermap/providers/db.py.\nimport type { Dtype } from \"../../core/types.js\";\n\nexport function sqliteTypeToInfermap(sqliteType: string | null | undefined): Dtype {\n  const t = (sqliteType ?? \"\").toUpperCase().trim();\n  if (t.includes(\"INT\")) return \"integer\";\n  if (/REAL|FLOAT|DOUBLE|NUMERIC|DECIMAL/.test(t)) return \"float\";\n  if (t.includes(\"BOOL\")) return \"boolean\";\n  if (t.includes(\"DATE\") && !t.includes(\"TIME\")) return \"date\";\n  if (t.includes(\"DATETIME\") || t.includes(\"TIMESTAMP\")) return \"datetime\";\n  return \"string\";\n}\n\nexport function pgTypeToInfermap(pgType: string | null | undefined): Dtype {\n  const t = (pgType ?? \"\").toLowerCase().trim();\n  if ([\"integer\", \"bigint\", \"smallint\", \"serial\", \"bigserial\"].includes(t))\n    return \"integer\";\n  if ([\"real\", \"double precision\", \"numeric\", \"decimal\", \"money\"].includes(t))\n    return \"float\";\n  if (t === \"boolean\") return \"boolean\";\n  if (t === \"date\") return \"date\";\n  if (\n    t === \"timestamp\" ||\n    t === \"timestamp with time zone\" ||\n    t === \"timestamp without time zone\"\n  )\n    return \"datetime\";\n  return \"string\";\n}\n\nexport function duckdbTypeToInfermap(\n  duckdbType: string | null | undefined\n): Dtype {\n  const t = (duckdbType ?? \"\").toUpperCase().trim();\n  if (\n    [\n      \"INTEGER\",\n      \"BIGINT\",\n      \"SMALLINT\",\n      \"TINYINT\",\n      \"HUGEINT\",\n      \"INT4\",\n      \"INT8\",\n      \"INT2\",\n      \"INT1\",\n    ].includes(t)\n  )\n    return \"integer\";\n  if (\n    [\"REAL\", \"FLOAT\", \"DOUBLE\", \"DECIMAL\", \"NUMERIC\", \"FLOAT4\", \"FLOAT8\"].includes(\n      t\n    )\n  )\n    return \"float\";\n  if (t === \"BOOLEAN\") return \"boolean\";\n  if (t === \"DATE\") return \"date\";\n  if (\n    t === \"TIMESTAMP\" ||\n    t === \"TIMESTAMP WITH TIME ZONE\" ||\n    t === \"TIMESTAMPTZ\"\n  )\n    return \"datetime\";\n  return \"string\";\n}\n\nexport type DbDriver = \"sqlite\" | \"postgresql\" | \"mysql\" | \"duckdb\";\n\nexport interface SqliteConnInfo {\n  driver: \"sqlite\";\n  path: string;\n}\nexport interface DuckdbConnInfo {\n  driver: \"duckdb\";\n  path: string;\n}\nexport interface PgConnInfo {\n  driver: \"postgresql\";\n  host: string | null;\n  port: number;\n  user: string | null;\n  password: string | null;\n  database: string;\n}\nexport interface MysqlConnInfo {\n  driver: \"mysql\";\n  host: string | null;\n  port: number;\n  user: string | null;\n  password: string | null;\n  database: string;\n}\nexport type ConnInfo = SqliteConnInfo | DuckdbConnInfo | PgConnInfo | MysqlConnInfo;\n\nexport class DbError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"DbError\";\n  }\n}\n\n/**\n * Parse a database URI into normalized ConnInfo.\n * Supported schemes: sqlite, postgresql/postgres, mysql, duckdb.\n */\nexport function parseConnection(uri: string): ConnInfo {\n  let parsed: URL;\n  try {\n    parsed = new URL(uri);\n  } catch {\n    throw new DbError(`Invalid database URI: ${uri}`);\n  }\n  const scheme = parsed.protocol.replace(/:$/, \"\").toLowerCase();\n\n  if (scheme === \"sqlite\") {\n    // sqlite:///path  → pathname starts with /\n    // sqlite:///C:/path on Windows → /C:/path\n    const raw = parsed.pathname;\n    const path = raw.startsWith(\"/\") ? raw.slice(1) : raw;\n    return { driver: \"sqlite\", path: decodeURIComponent(path) };\n  }\n\n  if (scheme === \"duckdb\") {\n    const raw = parsed.pathname;\n    const path = raw.startsWith(\"/\") ? raw.slice(1) : raw;\n    return { driver: \"duckdb\", path: decodeURIComponent(path) };\n  }\n\n  if (scheme === \"postgresql\" || scheme === \"postgres\") {\n    return {\n      driver: \"postgresql\",\n      host: parsed.hostname || null,\n      port: parsed.port ? Number(parsed.port) : 5432,\n      user: parsed.username ? decodeURIComponent(parsed.username) : null,\n      password: parsed.password ? decodeURIComponent(parsed.password) : null,\n      database: parsed.pathname.replace(/^\\//, \"\"),\n    };\n  }\n\n  if (scheme === \"mysql\") {\n    return {\n      driver: \"mysql\",\n      host: parsed.hostname || null,\n      port: parsed.port ? Number(parsed.port) : 3306,\n      user: parsed.username ? decodeURIComponent(parsed.username) : null,\n      password: parsed.password ? decodeURIComponent(parsed.password) : null,\n      database: parsed.pathname.replace(/^\\//, \"\"),\n    };\n  }\n\n  throw new DbError(`Unsupported database scheme: ${scheme}`);\n}\n","// Node-only database provider. Dispatches to the right driver via dynamic\n// import so optional peerDeps (better-sqlite3, pg, @duckdb/node-api) can be\n// absent without breaking the package build.\n//\n// Each driver implementation is small and mirrors the Python provider in\n// infermap/providers/db.py. We return the same FieldInfo shape + source_name\n// convention so downstream engine behavior matches Python.\nimport type { FieldInfo, SchemaInfo } from \"../../core/types.js\";\nimport { makeFieldInfo, makeSchemaInfo } from \"../../core/types.js\";\nimport {\n  DbError,\n  parseConnection,\n  pgTypeToInfermap,\n  sqliteTypeToInfermap,\n  duckdbTypeToInfermap,\n  type ConnInfo,\n} from \"./types.js\";\n\nconst DEFAULT_SAMPLE_SIZE = 500;\n\nexport interface DbExtractOptions {\n  table: string;\n  sampleSize?: number;\n}\n\n/** Extract a SchemaInfo from a database table by URI + table name. */\nexport async function extractDbSchema(\n  uri: string,\n  options: DbExtractOptions\n): Promise<SchemaInfo> {\n  const conn = parseConnection(uri);\n  const sampleSize = options.sampleSize ?? DEFAULT_SAMPLE_SIZE;\n\n  if (conn.driver === \"sqlite\") {\n    return extractSqlite(conn.path, options.table, sampleSize);\n  }\n  if (conn.driver === \"postgresql\") {\n    return extractPostgres(conn, options.table, sampleSize);\n  }\n  if (conn.driver === \"duckdb\") {\n    return extractDuckdb(conn.path, options.table, sampleSize);\n  }\n  if (conn.driver === \"mysql\") {\n    throw new DbError(\"MySQL support is not implemented\");\n  }\n  throw new DbError(`Unsupported driver: ${(conn as ConnInfo).driver}`);\n}\n\n// ---------- SQLite (better-sqlite3) ----------\n\nasync function loadBetterSqlite(): Promise<unknown> {\n  try {\n    // Module not statically typed — it's an optional peerDep, so we\n    // intentionally use a non-literal import specifier to bypass TS resolution.\n    const mod: { default: unknown } = await import(\n      /* @vite-ignore */ \"better-sqlite3\" as string\n    );\n    return mod.default;\n  } catch {\n    throw new DbError(\n      \"better-sqlite3 is required for SQLite. Install it: npm install better-sqlite3\"\n    );\n  }\n}\n\nasync function extractSqlite(\n  path: string,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const Database = (await loadBetterSqlite()) as new (\n    path: string,\n    options?: { readonly?: boolean }\n  ) => {\n    prepare(sql: string): {\n      all(...params: unknown[]): unknown[];\n      get(...params: unknown[]): unknown;\n    };\n    close(): void;\n  };\n\n  let db;\n  try {\n    db = new Database(path, { readonly: true });\n  } catch (e) {\n    throw new DbError(\n      `Cannot connect to SQLite database at ${path}: ${String(e)}`\n    );\n  }\n\n  try {\n    const exists = db\n      .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\")\n      .get(table);\n    if (!exists) {\n      throw new DbError(`Table '${table}' not found in SQLite database: ${path}`);\n    }\n\n    type PragmaRow = { cid: number; name: string; type: string };\n    const pragma = db.prepare(`PRAGMA table_info(${table})`).all() as PragmaRow[];\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalRow = db.prepare(`SELECT COUNT(*) AS c FROM ${quoted}`).get() as {\n      c: number;\n    };\n    const total = Number(totalRow.c);\n\n    const sampleRows = db\n      .prepare(`SELECT * FROM ${quoted} LIMIT ?`)\n      .all(sampleSize) as Array<Record<string, unknown>>;\n\n    const fields: FieldInfo[] = [];\n    for (const col of pragma) {\n      const nullRow = db\n        .prepare(\n          `SELECT COUNT(*) AS c FROM ${quoted} WHERE \"${col.name.replace(/\"/g, '\"\"')}\" IS NULL`\n        )\n        .get() as { c: number };\n      const nullCount = Number(nullRow.c);\n      const nullRate = total > 0 ? nullCount / total : 0;\n\n      const rawSamples: unknown[] = [];\n      for (const row of sampleRows) {\n        const v = row[col.name];\n        if (v !== null && v !== undefined) rawSamples.push(v);\n      }\n      const sampleValues = rawSamples\n        .slice(0, sampleSize)\n        .map((v) => String(v));\n      const unique = new Set(rawSamples.map((v) => String(v))).size;\n      const uniqueRate = total > 0 ? unique / total : 0;\n\n      fields.push(\n        makeFieldInfo({\n          name: col.name,\n          dtype: sqliteTypeToInfermap(col.type),\n          sampleValues,\n          nullRate,\n          uniqueRate,\n          valueCount: total,\n          metadata: { db_type: col.type },\n        })\n      );\n    }\n\n    return makeSchemaInfo({ fields, sourceName: table });\n  } finally {\n    db.close();\n  }\n}\n\n// ---------- PostgreSQL (pg) ----------\n\nasync function loadPg(): Promise<unknown> {\n  try {\n    return await import(/* @vite-ignore */ \"pg\" as string);\n  } catch {\n    throw new DbError(\n      \"pg is required for PostgreSQL. Install it: npm install pg\"\n    );\n  }\n}\n\nasync function extractPostgres(\n  conn: Extract<ConnInfo, { driver: \"postgresql\" }>,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const pg = await loadPg();\n  const ClientCtor = (pg as { Client: new (cfg: object) => unknown }).Client;\n  type PgClient = {\n    connect(): Promise<void>;\n    query<T = unknown>(\n      text: string,\n      values?: unknown[]\n    ): Promise<{ rows: T[] }>;\n    end(): Promise<void>;\n  };\n  const client = new ClientCtor({\n    host: conn.host,\n    port: conn.port,\n    user: conn.user,\n    password: conn.password,\n    database: conn.database,\n  }) as PgClient;\n\n  try {\n    await client.connect();\n  } catch (e) {\n    throw new DbError(\n      `Cannot connect to PostgreSQL at ${conn.host}:${conn.port}: ${String(e)}`\n    );\n  }\n\n  try {\n    const cols = await client.query<{\n      column_name: string;\n      data_type: string;\n    }>(\n      `SELECT column_name, data_type\n       FROM information_schema.columns\n       WHERE table_name = $1\n       ORDER BY ordinal_position`,\n      [table]\n    );\n    if (cols.rows.length === 0) {\n      throw new DbError(`Table '${table}' not found or has no columns`);\n    }\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalRes = await client.query<{ count: string }>(\n      `SELECT COUNT(*)::text AS count FROM ${quoted}`\n    );\n    const total = Number(totalRes.rows[0]!.count);\n\n    const sampleRes = await client.query<Record<string, unknown>>(\n      `SELECT * FROM ${quoted} LIMIT $1`,\n      [sampleSize]\n    );\n    const sampleRows = sampleRes.rows;\n\n    const fields: FieldInfo[] = cols.rows.map((col) => {\n      const rawSamples: unknown[] = [];\n      let nulls = 0;\n      for (const row of sampleRows) {\n        const v = row[col.column_name];\n        if (v === null || v === undefined) nulls++;\n        else rawSamples.push(v);\n      }\n      const totalSampled = sampleRows.length;\n      const nullRateRaw = totalSampled > 0 ? nulls / totalSampled : 0;\n      const nullRate = Math.round(nullRateRaw * 10000) / 10000;\n\n      const uniqueStrings = new Set(rawSamples.map((v) => String(v)));\n      const uniqueRateRaw =\n        rawSamples.length > 0 ? uniqueStrings.size / rawSamples.length : 0;\n      const uniqueRate = Math.round(uniqueRateRaw * 10000) / 10000;\n\n      return makeFieldInfo({\n        name: col.column_name,\n        dtype: pgTypeToInfermap(col.data_type),\n        sampleValues: rawSamples.slice(0, sampleSize).map((v) => String(v)),\n        nullRate,\n        uniqueRate,\n        // Match the Python quirk: value_count = total - int(null_rate * total)\n        valueCount: total - Math.trunc(nullRate * total),\n        metadata: { db_type: col.data_type },\n      });\n    });\n\n    return makeSchemaInfo({\n      fields,\n      sourceName: `${conn.database}.${table}`,\n    });\n  } finally {\n    await client.end();\n  }\n}\n\n// ---------- DuckDB (@duckdb/node-api) ----------\n\nasync function loadDuckdb(): Promise<unknown> {\n  try {\n    return await import(/* @vite-ignore */ \"@duckdb/node-api\" as string);\n  } catch {\n    throw new DbError(\n      \"@duckdb/node-api is required for DuckDB. Install it: npm install @duckdb/node-api\"\n    );\n  }\n}\n\nasync function extractDuckdb(\n  path: string,\n  table: string,\n  sampleSize: number\n): Promise<SchemaInfo> {\n  const duckdb = await loadDuckdb();\n  type DuckInstance = {\n    connect(): Promise<DuckConnection>;\n    closeSync?(): void;\n  };\n  type DuckConnection = {\n    runAndReadAll(sql: string, params?: unknown[]): Promise<{\n      getRows(): unknown[][];\n      getRowObjects(): Array<Record<string, unknown>>;\n    }>;\n    closeSync?(): void;\n  };\n  const api = duckdb as {\n    DuckDBInstance: { create(path: string): Promise<DuckInstance> };\n  };\n\n  const dbPath = path || \":memory:\";\n  const instance = await api.DuckDBInstance.create(dbPath);\n  const conn = await instance.connect();\n\n  try {\n    const colsReader = await conn.runAndReadAll(\n      `SELECT column_name, data_type FROM information_schema.columns\n       WHERE table_name = ? ORDER BY ordinal_position`,\n      [table]\n    );\n    const cols = colsReader.getRowObjects() as Array<{\n      column_name: string;\n      data_type: string;\n    }>;\n    if (cols.length === 0) {\n      throw new DbError(`Table '${table}' not found in DuckDB: ${dbPath}`);\n    }\n\n    const quoted = `\"${table.replace(/\"/g, '\"\"')}\"`;\n    const totalReader = await conn.runAndReadAll(\n      `SELECT COUNT(*)::BIGINT AS c FROM ${quoted}`\n    );\n    const totalRow = totalReader.getRowObjects()[0] as { c: bigint | number };\n    const total = Number(totalRow.c);\n\n    const sampleReader = await conn.runAndReadAll(\n      `SELECT * FROM ${quoted} USING SAMPLE ${sampleSize}`\n    );\n    const sampleRows = sampleReader.getRowObjects() as Array<\n      Record<string, unknown>\n    >;\n\n    const fields: FieldInfo[] = cols.map((col) => {\n      const rawSamples: unknown[] = [];\n      let nulls = 0;\n      for (const row of sampleRows) {\n        const v = row[col.column_name];\n        if (v === null || v === undefined) nulls++;\n        else rawSamples.push(v);\n      }\n      const totalSampled = sampleRows.length;\n      const nullRateRaw = totalSampled > 0 ? nulls / totalSampled : 0;\n      const nullRate = Math.round(nullRateRaw * 10000) / 10000;\n\n      const uniqueStrings = new Set(rawSamples.map((v) => String(v)));\n      const uniqueRateRaw =\n        rawSamples.length > 0 ? uniqueStrings.size / rawSamples.length : 0;\n      const uniqueRate = Math.round(uniqueRateRaw * 10000) / 10000;\n\n      return makeFieldInfo({\n        name: col.column_name,\n        dtype: duckdbTypeToInfermap(col.data_type),\n        sampleValues: rawSamples.slice(0, sampleSize).map((v) => String(v)),\n        nullRate,\n        uniqueRate,\n        valueCount: total - Math.trunc(nullRate * total),\n        metadata: { db_type: col.data_type },\n      });\n    });\n\n    return makeSchemaInfo({\n      fields,\n      sourceName: `${dbPath}:${table}`,\n    });\n  } finally {\n    if (conn.closeSync) conn.closeSync();\n    if (instance.closeSync) instance.closeSync();\n  }\n}\n","#!/usr/bin/env node\n// infermap CLI — map, apply, inspect, validate.\n// Mirrors infermap/cli.py but with TS ergonomics. Uses node:util/parseArgs\n// (stable since Node 18) to stay zero-runtime-dep.\n//\n// Inputs accepted for <source>/<target>:\n//   - .csv file path\n//   - .json file path (array of records OR { \"fields\": [...] } schema definition)\n//   - database URI (sqlite://, postgresql://, postgres://, duckdb://) + --table\n\nimport { parseArgs } from \"node:util\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { MapEngine } from \"./core/engine.js\";\nimport { fromConfig, mapResultToConfigJson, ConfigError } from \"./core/config.js\";\nimport { mapResultToJson, mapResultToReport } from \"./core/types.js\";\nimport type { MapResult, SchemaInfo } from \"./core/types.js\";\nimport { extractSchemaFromFile } from \"./node/fs.js\";\nimport { extractDbSchema } from \"./node/db/provider.js\";\nimport { parseCsv } from \"./core/util/csv.js\";\n\nconst USAGE = `infermap — inference-driven schema mapping engine\n\nUsage:\n  infermap map <source> <target> [options]\n  infermap apply <source> --config <file> --output <file>\n  infermap inspect <source> [--table <name>]\n  infermap validate <source> --config <file> [--required <fields>] [--strict]\n  infermap --help\n\nCommon options:\n  --table <name>         table name for DB sources\n  --format <fmt>         output format: table | json  (default: table)\n  --required <fields>    comma-separated required target field names\n  --schema-file <path>   JSON schema definition file merged into target\n  --min-confidence <n>   minimum confidence threshold (default 0.2)\n  -o, --output <path>    write config JSON to this path\n  --config <path>        input config (for apply/validate)\n  --strict               exit 1 if required fields unmapped (validate)\n`;\n\nfunction die(message: string, code = 1): never {\n  process.stderr.write(`Error: ${message}\\n`);\n  process.exit(code);\n}\n\nfunction isDbUri(source: string): boolean {\n  return /^(sqlite|postgresql|postgres|duckdb|mysql):\\/\\//i.test(source);\n}\n\nasync function resolveSchema(\n  source: string,\n  table: string | undefined\n): Promise<SchemaInfo> {\n  if (isDbUri(source)) {\n    if (!table) die(`--table is required when source is a database URI (${source})`);\n    return extractDbSchema(source, { table: table! });\n  }\n  return extractSchemaFromFile(source);\n}\n\nfunction printTable(result: MapResult): void {\n  const header = `${\"SOURCE\".padEnd(30)} ${\"TARGET\".padEnd(30)} ${\"CONF\".padStart(6)}  REASONING`;\n  process.stdout.write(`${header}\\n${\"-\".repeat(90)}\\n`);\n  for (const m of result.mappings) {\n    const reasoning =\n      m.reasoning.length > 40 ? `${m.reasoning.slice(0, 40)}...` : m.reasoning;\n    const conf = m.confidence.toFixed(3).padStart(6);\n    process.stdout.write(\n      `${m.source.padEnd(30)} ${m.target.padEnd(30)} ${conf}  ${reasoning}\\n`\n    );\n  }\n  if (result.unmappedSource.length > 0) {\n    process.stdout.write(\n      `\\nUnmapped source fields: ${result.unmappedSource.join(\", \")}\\n`\n    );\n  }\n  if (result.unmappedTarget.length > 0) {\n    process.stdout.write(\n      `Unmapped target fields: ${result.unmappedTarget.join(\", \")}\\n`\n    );\n  }\n  if (result.warnings.length > 0) {\n    process.stdout.write(\"\\nWarnings:\\n\");\n    for (const w of result.warnings) process.stdout.write(`  ! ${w}\\n`);\n  }\n}\n\n// ---------- commands ----------\n\nasync function cmdMap(argv: string[]): Promise<number> {\n  const { values, positionals } = parseArgs({\n    args: argv,\n    allowPositionals: true,\n    options: {\n      table: { type: \"string\" },\n      required: { type: \"string\" },\n      \"schema-file\": { type: \"string\" },\n      format: { type: \"string\", default: \"table\" },\n      output: { type: \"string\", short: \"o\" },\n      \"min-confidence\": { type: \"string\", default: \"0.2\" },\n    },\n  });\n  const [source, target] = positionals;\n  if (!source || !target) {\n    die(\"map requires <source> and <target> positional arguments\");\n  }\n\n  const src = await resolveSchema(source, values.table);\n  const tgt = await resolveSchema(target, values.table);\n\n  const required =\n    typeof values.required === \"string\"\n      ? values.required.split(\",\").map((s) => s.trim()).filter(Boolean)\n      : undefined;\n\n  let schemaFile: SchemaInfo | undefined;\n  if (typeof values[\"schema-file\"] === \"string\") {\n    schemaFile = await extractSchemaFromFile(values[\"schema-file\"]);\n  }\n\n  const engine = new MapEngine({\n    minConfidence: Number(values[\"min-confidence\"]),\n  });\n  const subOpts: Parameters<typeof engine.mapSchemas>[2] = {};\n  if (required !== undefined) subOpts.required = required;\n  if (schemaFile !== undefined) subOpts.schemaFile = schemaFile;\n  const result = engine.mapSchemas(src, tgt, subOpts);\n\n  if (values.format === \"json\") {\n    process.stdout.write(`${mapResultToJson(result)}\\n`);\n  } else {\n    printTable(result);\n  }\n\n  if (typeof values.output === \"string\") {\n    await writeFile(values.output, mapResultToConfigJson(result), \"utf8\");\n  }\n  return 0;\n}\n\nasync function cmdApply(argv: string[]): Promise<number> {\n  const { values, positionals } = parseArgs({\n    args: argv,\n    allowPositionals: true,\n    options: {\n      config: { type: \"string\" },\n      output: { type: \"string\", short: \"o\" },\n    },\n  });\n  const [source] = positionals;\n  if (!source) die(\"apply requires <source> positional argument\");\n  if (!values.config) die(\"apply requires --config <path>\");\n  if (!values.output) die(\"apply requires --output <path>\");\n\n  if (extname(source).toLowerCase() !== \".csv\") {\n    die(\"apply currently only supports CSV sources\");\n  }\n\n  let mapResult: MapResult;\n  try {\n    const cfgText = await readFile(values.config, \"utf8\");\n    mapResult = fromConfig(cfgText);\n  } catch (e) {\n    if (e instanceof ConfigError) die(`Config error: ${e.message}`);\n    die(`Could not read config: ${String(e)}`);\n  }\n\n  const text = await readFile(source, \"utf8\");\n  const { headers, rows } = parseCsv(text);\n\n  // Build rename map, failing on missing source columns\n  const renameMap = new Map<string, string>();\n  const colSet = new Set(headers);\n  for (const m of mapResult.mappings) {\n    if (!colSet.has(m.source)) {\n      die(`Source column missing from CSV: ${m.source}`);\n    }\n    renameMap.set(m.source, m.target);\n  }\n  const newHeaders = headers.map((h) => renameMap.get(h) ?? h);\n\n  // Write output CSV\n  const escape = (v: string): string =>\n    /[\",\\r\\n]/.test(v) ? `\"${v.replace(/\"/g, '\"\"')}\"` : v;\n  const lines = [newHeaders.map(escape).join(\",\")];\n  for (const row of rows) {\n    lines.push(headers.map((h) => escape(row[h] ?? \"\")).join(\",\"));\n  }\n  await writeFile(values.output, `${lines.join(\"\\n\")}\\n`, \"utf8\");\n  return 0;\n}\n\nasync function cmdInspect(argv: string[]): Promise<number> {\n  const { values, positionals } = parseArgs({\n    args: argv,\n    allowPositionals: true,\n    options: { table: { type: \"string\" } },\n  });\n  const [source] = positionals;\n  if (!source) die(\"inspect requires <source> positional argument\");\n\n  const schema = await resolveSchema(source, values.table);\n  process.stdout.write(`Source: ${schema.sourceName || source}\\n`);\n  process.stdout.write(`Fields: ${schema.fields.length}\\n\\n`);\n  const header = `${\"FIELD\".padEnd(30)} ${\"TYPE\".padEnd(12)} ${\"NULL%\".padStart(6)}  ${\"UNIQ%\".padStart(6)}  SAMPLES`;\n  process.stdout.write(`${header}\\n${\"-\".repeat(85)}\\n`);\n  for (const f of schema.fields) {\n    const samples = f.sampleValues.slice(0, 3).join(\", \");\n    const nullPct = `${(f.nullRate * 100).toFixed(1)}%`.padStart(6);\n    const uniqPct = `${(f.uniqueRate * 100).toFixed(1)}%`.padStart(6);\n    process.stdout.write(\n      `${f.name.padEnd(30)} ${f.dtype.padEnd(12)} ${nullPct}  ${uniqPct}  ${samples}\\n`\n    );\n  }\n  return 0;\n}\n\nasync function cmdValidate(argv: string[]): Promise<number> {\n  const { values, positionals } = parseArgs({\n    args: argv,\n    allowPositionals: true,\n    options: {\n      config: { type: \"string\" },\n      required: { type: \"string\" },\n      strict: { type: \"boolean\", default: false },\n    },\n  });\n  const [source] = positionals;\n  if (!source) die(\"validate requires <source> positional argument\");\n  if (!values.config) die(\"validate requires --config <path>\");\n\n  let mapResult: MapResult;\n  try {\n    const cfgText = await readFile(values.config, \"utf8\");\n    mapResult = fromConfig(cfgText);\n  } catch (e) {\n    if (e instanceof ConfigError) die(`Config error: ${e.message}`);\n    die(`Could not read config: ${String(e)}`);\n  }\n\n  const schema = await resolveSchema(source, undefined);\n  const sourceCols = new Set(schema.fields.map((f) => f.name));\n\n  const missingSources = mapResult.mappings\n    .filter((m) => !sourceCols.has(m.source))\n    .map((m) => m.source);\n  if (missingSources.length > 0) {\n    process.stdout.write(`Missing source columns: ${missingSources.join(\", \")}\\n`);\n  } else {\n    process.stdout.write(\"All mapped source columns are present.\\n\");\n  }\n\n  const requiredList =\n    typeof values.required === \"string\"\n      ? values.required.split(\",\").map((s) => s.trim()).filter(Boolean)\n      : [];\n  const mappedTargets = new Set(mapResult.mappings.map((m) => m.target));\n  const missingRequired = requiredList.filter((r) => !mappedTargets.has(r));\n\n  if (missingRequired.length > 0) {\n    process.stdout.write(`Required fields not mapped: ${missingRequired.join(\", \")}\\n`);\n    if (values.strict) return 1;\n  } else if (requiredList.length > 0) {\n    process.stdout.write(\"All required fields are mapped.\\n\");\n  }\n  return 0;\n}\n\n// ---------- entrypoint ----------\n\n// Canonical CLI command set (mirrors the main() dispatch); read by the API-parity emitter.\nexport const COMMANDS = [\"apply\", \"inspect\", \"map\", \"validate\"];\n\nasync function main(): Promise<number> {\n  const [, , cmd, ...rest] = process.argv;\n\n  if (!cmd || cmd === \"--help\" || cmd === \"-h\") {\n    process.stdout.write(USAGE);\n    return 0;\n  }\n\n  // Touch mapResultToReport so the exported helper gets bundled.\n  void mapResultToReport;\n\n  try {\n    switch (cmd) {\n      case \"map\":\n        return await cmdMap(rest);\n      case \"apply\":\n        return await cmdApply(rest);\n      case \"inspect\":\n        return await cmdInspect(rest);\n      case \"validate\":\n        return await cmdValidate(rest);\n      default:\n        process.stderr.write(`Unknown command: ${cmd}\\n\\n${USAGE}`);\n        return 1;\n    }\n  } catch (e) {\n    process.stderr.write(`Error: ${e instanceof Error ? e.message : String(e)}\\n`);\n    return 1;\n  }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n  main().then((code) => process.exit(code));\n}\n"]}