{"version":3,"sources":["../src/core/types.ts","../src/core/assignment/hungarian.ts","../src/core/domainPack.ts","../src/core/detect.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/llm.ts","../src/core/scorers/initialism.ts","../src/core/scorers/registry.ts","../src/core/calibration.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/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/core/config.ts","../src/core/map.ts"],"names":["v","_","listDomains","loadDomain","tokens","a","b","DOMAIN","round"],"mappings":"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","file":"index.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","// 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","// DomainPackTarget — adapts a goldencheck-types DomainPack as an InferMap target.\nimport type { DomainPack } from \"goldencheck-types\";\nimport type { FieldInfo, SchemaInfo } from \"./types.js\";\n\nexport class DomainPackTarget {\n  constructor(public readonly pack: DomainPack) {}\n\n  toSchemaInfo(): SchemaInfo {\n    const fields: FieldInfo[] = Object.entries(this.pack.types).map(\n      ([type_name, spec]) => ({\n        name: type_name,\n        dtype: \"string\",\n        sampleValues: [...spec.name_hints],\n        nullRate: 0,\n        uniqueRate: 0,\n        valueCount: 0,\n        metadata: {\n          value_signals: spec.value_signals,\n          confidence_threshold: spec.confidence_threshold,\n          // Forward suppress + description so downstream scanners can read\n          // them without re-loading the YAML pack. (Same shape as the\n          // Python `DomainPackTarget.to_schema_info`.)\n          suppress: [...spec.suppress],\n          description: spec.description,\n          domain: this.pack.name,\n        },\n      }),\n    );\n    return {\n      sourceName: `domain:${this.pack.name}`,\n      fields,\n      requiredFields: [],\n    };\n  }\n}\n\nexport function isDomainPackTarget(x: unknown): x is DomainPackTarget {\n  return x instanceof DomainPackTarget;\n}\n","// Lightweight domain-pack auto-detection from column names.\nimport { listDomains, loadDomain } from \"goldencheck-types\";\nimport type { DetectionResult } from \"goldencheck-types\";\nimport { getInfermapBackend } from \"./wasm/backend.js\";\n\nexport const DEFAULT_MIN_SCORE = 0.3;\n\nconst TOKEN_SPLIT = /[_\\-.\\s]+/;\n\nexport interface DetectInput {\n  columns: string[];\n}\n\nfunction tokens(s: string): string[] {\n  return s.toLowerCase().split(TOKEN_SPLIT).filter(Boolean);\n}\n\n/** True iff `hint`'s tokens appear as a contiguous run in `col`'s tokens.\n *  Replaces the prior symmetric `c.includes(h) || h.includes(c)`, which\n *  fired on partial overlaps — a 2-char hint like `\"id\"` matched\n *  `account_id`, `paid`, `void_id` indiscriminately. Token-boundary\n *  matching keeps `\"npi\"` matching `provider_npi` while rejecting it\n *  against `\"npiece\"`. */\nfunction hintMatches(hint: string, col: string): boolean {\n  const h = tokens(hint);\n  const c = tokens(col);\n  if (h.length === 0 || c.length === 0) return false;\n  for (let i = 0; i <= c.length - h.length; i++) {\n    let ok = true;\n    for (let j = 0; j < h.length; j++) {\n      if (c[i + j] !== h[j]) {\n        ok = false;\n        break;\n      }\n    }\n    if (ok) return true;\n  }\n  return false;\n}\n\n/** Pure scoring over resolved [name, hints[]] domains — the WASM parity oracle.\n *  Byte-identical to infermap-core::detect_domain for NON-EMPTY columns. The\n *  empty-columns `no_data` guard lives in detectDomainDetailed (the kernel guards\n *  it too), so scoreDomains is never called with empty columns in production. */\nexport function scoreDomains(\n  columns: string[],\n  resolved: Array<[string, string[]]>,\n  minScore: number,\n): DetectionResult {\n  const scored: Array<[string, number]> = [];\n  for (const [name, hints] of resolved) {\n    if (hints.length === 0) continue; // == Rust `hints.is_empty()` skip\n    let hits = 0;\n    for (const c of columns) {\n      for (const h of hints) {\n        if (hintMatches(h, c)) {\n          hits++;\n          break;\n        }\n      }\n    }\n    scored.push([name, hits / Math.max(columns.length, 1)]);\n  }\n  if (scored.length === 0) {\n    return { domain: null, score: 0, runner_up: null, runner_up_score: 0, reason: \"no_data\" };\n  }\n  scored.sort((a, b) => b[1] - a[1]);\n  const [bestName, bestScore] = scored[0]!;\n  const runner = scored[1];\n  const runnerName = runner ? runner[0] : null;\n  const runnerScore = runner ? runner[1] : 0;\n  if (bestScore < minScore) {\n    return { domain: null, score: bestScore, runner_up: runnerName, runner_up_score: runnerScore, reason: \"below_min_score\" };\n  }\n  const topCount = scored.filter(([, s]) => s === bestScore).length;\n  if (topCount > 1) {\n    return { domain: null, score: bestScore, runner_up: runnerName, runner_up_score: runnerScore, reason: \"tie\" };\n  }\n  return { domain: bestName, score: bestScore, runner_up: runnerName, runner_up_score: runnerScore, reason: \"confident\" };\n}\n\nexport function detectDomain(\n  input: DetectInput | { records?: ReadonlyArray<Record<string, unknown>> },\n  candidates?: string[],\n  minScore: number = DEFAULT_MIN_SCORE,\n): string | null {\n  return detectDomainDetailed(input, candidates, minScore).domain;\n}\n\n/** Auto-detect with full diagnostic info. See `DetectionResult` for the\n *  shape. Callers like `goldenpipe`'s infer_schema stage use this to\n *  distinguish \"confident pick\" from \"tied\" / \"below threshold\" /\n *  \"no data\" and surface that to the InferredSchema's evidence map. */\nexport function detectDomainDetailed(\n  input: DetectInput | { records?: ReadonlyArray<Record<string, unknown>> },\n  candidates?: string[],\n  minScore: number = DEFAULT_MIN_SCORE,\n): DetectionResult {\n  let columns: string[];\n  if (\"columns\" in input && Array.isArray(input.columns)) {\n    columns = input.columns;\n  } else if (\"records\" in input && input.records && input.records.length > 0) {\n    columns = Object.keys(input.records[0]!);\n  } else {\n    return { domain: null, score: 0, runner_up: null, runner_up_score: 0, reason: \"no_data\" };\n  }\n  if (columns.length === 0) {\n    return { domain: null, score: 0, runner_up: null, runner_up_score: 0, reason: \"no_data\" };\n  }\n\n  const domainNames = candidates ?? listDomains().filter((d) => d !== \"generic\");\n  // Hoist hint resolution into a pre-pass so the SAME resolved input feeds the\n  // kernel or the pure path. Empty-hint domains are INCLUDED (both paths skip\n  // them: kernel via hints.is_empty(), pure via hints.length===0), so scoring is\n  // identical to the pre-refactor inline loop.\n  const resolved: Array<[string, string[]]> = domainNames.map((d) => {\n    const pack = loadDomain(d);\n    const allHints = new Set<string>();\n    for (const spec of Object.values(pack.types)) {\n      for (const h of spec.name_hints) allHints.add(h);\n    }\n    return [d, Array.from(allHints)];\n  });\n\n  const backend = getInfermapBackend();\n  if (backend) {\n    return backend.detectDomain(columns, resolved, minScore);\n  }\n  return scoreDomains(columns, resolved, minScore);\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","// LLM scorer — pluggable adapter. Default implementation abstains (returns null),\n// matching the Python stub in infermap/scorers/llm.py.\n//\n// Callers can construct an LLMScorer with an adapter function:\n//\n//   const scorer = new LLMScorer({\n//     weight: 0.8,\n//     adapter: async (prompt) => openai.chat.completions.create({ ... }),\n//   });\n//\n// The adapter is invoked per (source, target) pair. Because adapters are async\n// but the Scorer interface is sync (to match the Python Protocol), this\n// default scorer is *not* wired into the sync map pipeline. Use the engine's\n// async `mapWithLLM` path (future step) to include it. For now, this file\n// ports the stub and exposes the adapter type for future work.\nimport type { FieldInfo, ScorerResult } from \"../types.js\";\nimport type { Scorer } from \"./base.js\";\n\nexport type LLMAdapter = (prompt: string) => Promise<string>;\n\nexport interface LLMScorerOptions {\n  weight?: number;\n  adapter?: LLMAdapter;\n}\n\nexport class LLMScorer implements Scorer {\n  readonly name = \"LLMScorer\";\n  readonly weight: number;\n  readonly adapter: LLMAdapter | undefined;\n\n  constructor(options: LLMScorerOptions = {}) {\n    this.weight = options.weight ?? 0.8;\n    this.adapter = options.adapter;\n  }\n\n  // Sync interface — always abstains. The async path lives on the engine\n  // and is introduced in Step 10+ when needed.\n  score(_source: FieldInfo, _target: FieldInfo): ScorerResult | null {\n    return null;\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","// Confidence calibration — post-assignment transform of raw scores into\n// calibrated probabilities. Mirrors infermap/calibration.py.\n//\n// A calibrator does NOT change which mappings the engine picks; it only\n// relabels the confidence attached to each picked mapping. JSON round-trip\n// uses a `kind` discriminator for portability between Python and JS.\n\nexport interface CalibratorJSON {\n  kind: string;\n  [k: string]: unknown;\n}\n\nexport interface Calibrator {\n  readonly kind: string;\n  fit(scores: readonly number[], correct: readonly number[]): void;\n  transform(scores: readonly number[]): number[];\n  toJSON(): CalibratorJSON;\n}\n\n// ---------- Identity ----------\n\nexport class IdentityCalibrator implements Calibrator {\n  readonly kind = \"identity\";\n  fit(_scores: readonly number[], _correct: readonly number[]): void {\n    // no-op\n  }\n  transform(scores: readonly number[]): number[] {\n    return scores.map((s) => s);\n  }\n  toJSON(): CalibratorJSON {\n    return { kind: this.kind };\n  }\n  static fromJSON(_obj: CalibratorJSON): IdentityCalibrator {\n    return new IdentityCalibrator();\n  }\n}\n\n// ---------- Isotonic (pool-adjacent-violators) ----------\n\nexport class IsotonicCalibrator implements Calibrator {\n  readonly kind = \"isotonic\";\n  private _x: number[];\n  private _y: number[];\n\n  constructor(x: number[] = [0, 1], y: number[] = [0, 1]) {\n    this._x = x.slice();\n    this._y = y.slice();\n  }\n\n  fit(scores: readonly number[], correct: readonly number[]): void {\n    const n = scores.length;\n    if (n === 0) return;\n    // Stable sort by score ascending.\n    const order = Array.from({ length: n }, (_, i) => i).sort((a, b) => {\n      const d = scores[a]! - scores[b]!;\n      return d !== 0 ? d : a - b;\n    });\n    const xs = order.map((i) => scores[i]!);\n    const ys = order.map((i) => correct[i]!);\n\n    // Pool-adjacent-violators.\n    const vals: number[] = [];\n    const wts: number[] = [];\n    for (const y of ys) {\n      vals.push(y);\n      wts.push(1);\n      while (vals.length >= 2 && vals[vals.length - 2]! > vals[vals.length - 1]!) {\n        const v2 = vals.pop()!;\n        const w2 = wts.pop()!;\n        const v1 = vals.pop()!;\n        const w1 = wts.pop()!;\n        vals.push((v1 * w1 + v2 * w2) / (w1 + w2));\n        wts.push(w1 + w2);\n      }\n    }\n\n    // Expand pooled values back to per-point fitted ys.\n    const fitted = new Array<number>(n);\n    let idx = 0;\n    for (let b = 0; b < vals.length; b++) {\n      const k = Math.round(wts[b]!);\n      for (let j = 0; j < k; j++) fitted[idx++] = vals[b]!;\n    }\n\n    // Dedup by xs: average fitted values for identical xs.\n    const uniqX: number[] = [];\n    const uniqY: number[] = [];\n    const counts: number[] = [];\n    for (let i = 0; i < n; i++) {\n      const xv = xs[i]!;\n      if (uniqX.length > 0 && uniqX[uniqX.length - 1] === xv) {\n        uniqY[uniqY.length - 1]! += fitted[i]!;\n        counts[counts.length - 1]! += 1;\n      } else {\n        uniqX.push(xv);\n        uniqY.push(fitted[i]!);\n        counts.push(1);\n      }\n    }\n    for (let i = 0; i < uniqY.length; i++) uniqY[i] = uniqY[i]! / counts[i]!;\n\n    // Enforce monotonicity (defensive) and clip to [0, 1].\n    for (let i = 1; i < uniqY.length; i++) {\n      if (uniqY[i]! < uniqY[i - 1]!) uniqY[i] = uniqY[i - 1]!;\n    }\n    for (let i = 0; i < uniqY.length; i++) {\n      uniqY[i] = Math.max(0, Math.min(1, uniqY[i]!));\n    }\n\n    this._x = uniqX;\n    this._y = uniqY;\n  }\n\n  transform(scores: readonly number[]): number[] {\n    if (this._x.length === 0) return scores.map((s) => s);\n    const out = new Array<number>(scores.length);\n    const x = this._x;\n    const y = this._y;\n    const last = x.length - 1;\n    for (let i = 0; i < scores.length; i++) {\n      const s = scores[i]!;\n      if (s <= x[0]!) {\n        out[i] = y[0]!;\n      } else if (s >= x[last]!) {\n        out[i] = y[last]!;\n      } else {\n        // Binary search.\n        let lo = 0;\n        let hi = last;\n        while (lo + 1 < hi) {\n          const mid = (lo + hi) >> 1;\n          if (x[mid]! <= s) lo = mid;\n          else hi = mid;\n        }\n        const x0 = x[lo]!;\n        const x1 = x[hi]!;\n        const y0 = y[lo]!;\n        const y1 = y[hi]!;\n        out[i] = x1 === x0 ? y0 : y0 + ((s - x0) * (y1 - y0)) / (x1 - x0);\n      }\n    }\n    return out;\n  }\n\n  toJSON(): CalibratorJSON {\n    return { kind: this.kind, x: this._x.slice(), y: this._y.slice() };\n  }\n\n  static fromJSON(obj: CalibratorJSON): IsotonicCalibrator {\n    if (!Array.isArray(obj[\"x\"]) || !Array.isArray(obj[\"y\"])) {\n      throw new Error(\n        \"IsotonicCalibrator.fromJSON: missing or non-array 'x'/'y' fields\"\n      );\n    }\n    const x = (obj[\"x\"] as number[]).map(Number);\n    const y = (obj[\"y\"] as number[]).map(Number);\n    if (x.length !== y.length) {\n      throw new Error(\n        `IsotonicCalibrator.fromJSON: x.length (${x.length}) !== y.length (${y.length})`\n      );\n    }\n    return new IsotonicCalibrator(x, y);\n  }\n}\n\n// ---------- Platt (sigmoid) ----------\n\nfunction logSigmoid(z: number): number {\n  // -log(1 + exp(-z)) numerically stable\n  if (z >= 0) return -Math.log1p(Math.exp(-z));\n  return z - Math.log1p(Math.exp(z));\n}\n\nexport class PlattCalibrator implements Calibrator {\n  readonly kind = \"platt\";\n  private _a: number;\n  private _b: number;\n\n  get a(): number { return this._a; }\n  get b(): number { return this._b; }\n\n  constructor(a = 1.0, b = 0.0) {\n    this._a = a;\n    this._b = b;\n  }\n\n  fit(scores: readonly number[], correct: readonly number[]): void {\n    if (scores.length === 0) return;\n    // Minimize binary cross-entropy over (a, b) via Nelder-Mead.\n    const nll = (params: [number, number]): number => {\n      const [a, b] = params;\n      let total = 0;\n      for (let i = 0; i < scores.length; i++) {\n        const z = a * scores[i]! + b;\n        const c = correct[i]!;\n        // c * log sigmoid(z) + (1-c) * log(1-sigmoid(z))\n        // log(1-sigmoid(z)) = logSigmoid(-z)\n        total += c * logSigmoid(z) + (1 - c) * logSigmoid(-z);\n      }\n      return -total;\n    };\n    const [a, b] = nelderMead2D(nll, [1.0, 0.0], 1e-6, 500);\n    this._a = a;\n    this._b = b;\n  }\n\n  transform(scores: readonly number[]): number[] {\n    const out = new Array<number>(scores.length);\n    for (let i = 0; i < scores.length; i++) {\n      const z = this._a * scores[i]! + this._b;\n      // Numerically stable sigmoid.\n      out[i] = z >= 0 ? 1 / (1 + Math.exp(-z)) : Math.exp(z) / (1 + Math.exp(z));\n    }\n    return out;\n  }\n\n  toJSON(): CalibratorJSON {\n    return { kind: this.kind, a: this._a, b: this._b };\n  }\n\n  static fromJSON(obj: CalibratorJSON): PlattCalibrator {\n    if (typeof obj[\"a\"] !== \"number\" || typeof obj[\"b\"] !== \"number\") {\n      throw new Error(\n        \"PlattCalibrator.fromJSON: missing or non-number 'a'/'b' fields\"\n      );\n    }\n    return new PlattCalibrator(obj[\"a\"], obj[\"b\"]);\n  }\n}\n\n/**\n * Minimal Nelder-Mead for 2D functions. Used by Platt calibration because\n * scipy.optimize isn't available in JS. Converges to `tol` or `maxIter`,\n * whichever first.\n */\nfunction nelderMead2D(\n  f: (p: [number, number]) => number,\n  x0: [number, number],\n  tol: number,\n  maxIter: number\n): [number, number] {\n  // Build an initial simplex.\n  const step = 0.1;\n  type P = [number, number];\n  const simplex: P[] = [\n    [x0[0], x0[1]],\n    [x0[0] + step, x0[1]],\n    [x0[0], x0[1] + step],\n  ];\n  let fs = simplex.map((p) => f(p));\n\n  const alpha = 1;\n  const gamma = 2;\n  const rho = 0.5;\n  const sigma = 0.5;\n\n  for (let iter = 0; iter < maxIter; iter++) {\n    // Sort by f ascending.\n    const idx = [0, 1, 2].sort((a, b) => fs[a]! - fs[b]!);\n    const s: P[] = [simplex[idx[0]!]!, simplex[idx[1]!]!, simplex[idx[2]!]!];\n    const fsorted = [fs[idx[0]!]!, fs[idx[1]!]!, fs[idx[2]!]!];\n    simplex[0] = s[0]!;\n    simplex[1] = s[1]!;\n    simplex[2] = s[2]!;\n    fs = fsorted;\n\n    // Convergence: range of f values and simplex size.\n    const fRange = Math.abs(fs[2]! - fs[0]!);\n    const sizeX = Math.max(\n      Math.abs(simplex[1]![0] - simplex[0]![0]),\n      Math.abs(simplex[2]![0] - simplex[0]![0])\n    );\n    const sizeY = Math.max(\n      Math.abs(simplex[1]![1] - simplex[0]![1]),\n      Math.abs(simplex[2]![1] - simplex[0]![1])\n    );\n    if (fRange < tol && sizeX < tol && sizeY < tol) break;\n\n    // Centroid of best two.\n    const cx = (simplex[0]![0] + simplex[1]![0]) / 2;\n    const cy = (simplex[0]![1] + simplex[1]![1]) / 2;\n\n    // Reflection.\n    const xr: P = [\n      cx + alpha * (cx - simplex[2]![0]),\n      cy + alpha * (cy - simplex[2]![1]),\n    ];\n    const fr = f(xr);\n    if (fr < fs[1]! && fr >= fs[0]!) {\n      simplex[2] = xr;\n      fs[2] = fr;\n      continue;\n    }\n    // Expansion.\n    if (fr < fs[0]!) {\n      const xe: P = [cx + gamma * (xr[0] - cx), cy + gamma * (xr[1] - cy)];\n      const fe = f(xe);\n      if (fe < fr) {\n        simplex[2] = xe;\n        fs[2] = fe;\n      } else {\n        simplex[2] = xr;\n        fs[2] = fr;\n      }\n      continue;\n    }\n    // Contraction.\n    const xc: P = [\n      cx + rho * (simplex[2]![0] - cx),\n      cy + rho * (simplex[2]![1] - cy),\n    ];\n    const fc = f(xc);\n    if (fc < fs[2]!) {\n      simplex[2] = xc;\n      fs[2] = fc;\n      continue;\n    }\n    // Shrink.\n    for (let i = 1; i < 3; i++) {\n      simplex[i] = [\n        simplex[0]![0] + sigma * (simplex[i]![0] - simplex[0]![0]),\n        simplex[0]![1] + sigma * (simplex[i]![1] - simplex[0]![1]),\n      ];\n      fs[i] = f(simplex[i]!);\n    }\n  }\n  return simplex[0]!;\n}\n\n// ---------- registry / JSON helpers ----------\n\nexport function loadCalibrator(obj: CalibratorJSON | string): Calibrator {\n  const parsed: CalibratorJSON = typeof obj === \"string\" ? JSON.parse(obj) : obj;\n  switch (parsed.kind) {\n    case \"identity\":\n      return IdentityCalibrator.fromJSON(parsed);\n    case \"isotonic\":\n      return IsotonicCalibrator.fromJSON(parsed);\n    case \"platt\":\n      return PlattCalibrator.fromJSON(parsed);\n    default:\n      throw new Error(`Unknown calibrator kind: ${String(parsed.kind)}`);\n  }\n}\n\nexport function saveCalibrator(cal: Calibrator): CalibratorJSON {\n  return cal.toJSON();\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","// 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","// 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","// Public `map()` convenience function — dispatches to MapEngine after\n// normalizing polymorphic inputs to SchemaInfo.\n\nimport type { MapEngineOptions, MapSchemasOptions } from \"./engine.js\";\nimport { MapEngine } from \"./engine.js\";\nimport type { SchemaInfo } from \"./types.js\";\nimport { DomainPackTarget, isDomainPackTarget } from \"./domainPack.js\";\nimport {\n  inferSchemaFromCsvText,\n  inferSchemaFromJsonText,\n} from \"./providers/file.js\";\nimport { inferSchemaFromRecords } from \"./providers/in-memory.js\";\nimport { parseSchemaDefinition } from \"./providers/schema-file.js\";\nimport type { MapResult } from \"./types.js\";\nimport {\n  applyScorerOverrides,\n  loadEngineConfig,\n  type EngineConfig,\n} from \"./config.js\";\nimport { AliasScorer } from \"./scorers/alias.js\";\nimport { defaultScorers } from \"./scorers/registry.js\";\n\n/**\n * Polymorphic input accepted by `map()`.\n * Edge-core knows nothing about filesystem paths or database URIs;\n * the Node wrapper (Step 15) layers those on top of this type.\n */\nexport type MapInput =\n  | SchemaInfo\n  | DomainPackTarget\n  | { records: ReadonlyArray<Record<string, unknown>>; sourceName?: string }\n  | { csvText: string; sourceName?: string }\n  | { jsonText: string; sourceName?: string }\n  | { schemaDefinition: string | object; sourceName?: string };\n\nexport interface MapOptions extends MapSchemasOptions {\n  engineOptions?: MapEngineOptions;\n  /**\n   * Engine config (JSON string or parsed object). Takes effect by rebuilding\n   * the default scorer list with overrides + alias extensions applied.\n   * Ignored if `engineOptions.scorers` is provided explicitly.\n   */\n  config?: string | EngineConfig;\n  sampleSize?: number;\n  /**\n   * When true, post-process so any mapping with confidence below the resolved\n   * threshold has ``target=null`` (treated as ``unknown`` downstream).\n   */\n  soft?: boolean;\n  /**\n   * Default threshold used when no per-type override is provided.\n   */\n  defaultThreshold?: number;\n}\n\nfunction isSchemaInfo(input: MapInput): input is SchemaInfo {\n  return (\n    typeof input === \"object\" &&\n    input !== null &&\n    \"fields\" in input &&\n    Array.isArray((input as SchemaInfo).fields)\n  );\n}\n\n/** Normalize any MapInput to a SchemaInfo. */\nexport function toSchemaInfo(input: MapInput, sampleSize?: number): SchemaInfo {\n  if (isDomainPackTarget(input)) return input.toSchemaInfo();\n  if (isSchemaInfo(input)) return input;\n\n  if (\"records\" in input) {\n    const opts: Parameters<typeof inferSchemaFromRecords>[1] = {};\n    if (input.sourceName !== undefined) opts.sourceName = input.sourceName;\n    if (sampleSize !== undefined) opts.sampleSize = sampleSize;\n    return inferSchemaFromRecords(input.records, opts);\n  }\n  if (\"csvText\" in input) {\n    const opts: Parameters<typeof inferSchemaFromCsvText>[1] = {};\n    if (input.sourceName !== undefined) opts.sourceName = input.sourceName;\n    if (sampleSize !== undefined) opts.sampleSize = sampleSize;\n    return inferSchemaFromCsvText(input.csvText, opts);\n  }\n  if (\"jsonText\" in input) {\n    const opts: Parameters<typeof inferSchemaFromJsonText>[1] = {};\n    if (input.sourceName !== undefined) opts.sourceName = input.sourceName;\n    if (sampleSize !== undefined) opts.sampleSize = sampleSize;\n    return inferSchemaFromJsonText(input.jsonText, opts);\n  }\n  if (\"schemaDefinition\" in input) {\n    return parseSchemaDefinition(\n      input.schemaDefinition as string,\n      input.sourceName ?? \"schema\"\n    );\n  }\n\n  throw new TypeError(\"Unrecognized MapInput shape\");\n}\n\n/**\n * Convenience wrapper: extracts schemas from both inputs and runs the engine.\n */\nexport function map(\n  source: MapInput,\n  target: MapInput,\n  options: MapOptions = {}\n): MapResult {\n  const srcSchema = toSchemaInfo(source, options.sampleSize);\n  const tgtSchema = toSchemaInfo(target, options.sampleSize);\n\n  // Build engine options, applying engine config if provided and scorers\n  // weren't overridden explicitly.\n  const engineOptions: MapEngineOptions = { ...options.engineOptions };\n  if (options.config !== undefined && engineOptions.scorers === undefined) {\n    const cfg = loadEngineConfig(options.config);\n    // Rebuild the default scorer chain with config-supplied extras.\n    const aliasScorer = new AliasScorer(cfg.aliases ?? {});\n    const base = defaultScorers().map((sc) =>\n      sc.name === \"AliasScorer\" ? aliasScorer : sc\n    );\n    engineOptions.scorers = applyScorerOverrides(base, cfg.scorers);\n  }\n\n  const engine = new MapEngine(engineOptions);\n  const subOpts: MapSchemasOptions = {};\n  if (options.required !== undefined) subOpts.required = options.required;\n  if (options.schemaFile !== undefined) subOpts.schemaFile = options.schemaFile;\n  let result = engine.mapSchemas(srcSchema, tgtSchema, subOpts);\n\n  if (options.soft) {\n    result = applySoft(\n      result,\n      isDomainPackTarget(target) ? target : null,\n      options.defaultThreshold ?? 0.7,\n    );\n  }\n  return result;\n}\n\nfunction applySoft(\n  result: MapResult,\n  domainTarget: DomainPackTarget | null,\n  defaultThreshold: number,\n): MapResult {\n  const thresholds: Record<string, number> = {};\n  if (domainTarget) {\n    for (const [type_name, spec] of Object.entries(domainTarget.pack.types)) {\n      thresholds[type_name] =\n        spec.confidence_threshold !== undefined\n          ? spec.confidence_threshold\n          : defaultThreshold;\n    }\n  }\n  return {\n    ...result,\n    mappings: result.mappings.map((fm) => {\n      const threshold = thresholds[fm.target] ?? defaultThreshold;\n      return fm.confidence < threshold ? { ...fm, target: null as any } : fm;\n    }),\n  };\n}\n"]}