// viz/app/linker_page.js import { esc, renderThumbHtml } from "./dom.js"; import { tokenizeQuery, matchesAllTokens, displaySku, keySkuForRow, normSearchText } from "./sku.js"; import { loadIndex } from "./state.js"; import { aggregateBySku } from "./catalog.js"; import { loadSkuRules, clearSkuRulesCache } from "./mapping.js"; import { inferGithubOwnerRepo, isLocalWriteMode, loadSkuMetaBestEffort, apiWriteSkuLink, apiWriteSkuIgnore, } from "./api.js"; import { addPendingLink, addPendingIgnore, pendingCounts, movePendingToSubmitted, clearPendingEdits, } from "./pending.js"; // ✅ NEW imports (refactor) import { buildUrlBySkuStore } from "./linker/url_map.js"; import { buildCanonStoreCache, makeSameStoreCanonFn } from "./linker/store_cache.js"; import { buildSizePenaltyForPair } from "./linker/size.js"; import { pickPreferredCanonical } from "./linker/canonical_pref.js"; import { smwsKeyFromName } from "./linker/similarity.js"; import { buildPricePenaltyForPair } from "./linker/price.js"; import { topSuggestions, recommendSimilar, computeInitialPairsFast } from "./linker/suggestions.js"; /* ---------------- Page ---------------- */ export async function renderSkuLinker($app) { const localWrite = isLocalWriteMode(); let rules = await loadSkuRules(); $app.innerHTML = `